2017-09-30 2 views
0

Gibt es eine effizientere Möglichkeit, diese Abfrage durchzuführen? Es läuft, dauert aber ca. 6 Minuten. Ich glaube, die Multiple-Select-Anweisungen erzeugen die Verzögerung. Running von ihnen selbst die Rückkehr ein Ergebnis in < 1 Sek.Verwenden von Auswählen für mehrere Spalten

SELECT 
    x.HPCODE AS [Health Plan], 
    x.HPFROMDT AS [Eff Date], 
    x.MEMBID AS [ID #], 
    x.LASTNM AS [Mbr L Name], 
    x.FIRSTNM AS [Mbr F Name], 
    x.BIRTH AS DOB, 
    DATEDIFF(YEAR, birth, GETDATE()) AS Age, 
    x.PCP as [Prov ID#], 
    Y.LASTNAME as [Prov L Name], 
    Y.FIRSTNAME as [Prov F Name], 
    PA.PHONE as [Provider Phone], 
    (SELECT MAX(cd.FROMDATESVC) 
    FROM [dbo].[Claim_Masters] cm 
    LEFT JOIN [dbo].[Claim_Details] cd ON cm.claimno = cd.claimno 
             AND cm.MEMBID = x.MEMBID 
    WHERE LEFT(cd.PROCCODE, 5) IN ('G0402', 'G0438', 'G0439') 
     AND YEAR(cm.SERVICEDATEFROM) = YEAR(GETDATE())) AS [AWV], 
    (SELECT MAX(cd.FROMDATESVC) 
    FROM [dbo].[Claim_Masters] cm 
    LEFT JOIN [dbo].[Claim_Details] cd ON cm.claimno = cd.claimno 
             AND cm.MEMBID = x.MEMBID 
    WHERE (LEFT(cd.PROCCODE, 5) IN ('G0402', 'G0438', 'G0439') 
      OR RIGHT(cd.PROCCODE, 5) IN ('99490', '99487', '99489')) 
     AND YEAR(cm.SERVICEDATEFROM) = YEAR(GETDATE())) AS [CCM], 
    (select max(cd.FROMDATESVC) from [dbo].[Claim_Masters] cm left join [dbo].[Claim_Details] cd on cm.claimno = cd.claimno and cm.MEMBID = x.MEMBID Where (Right(cd.PROCCODE,5) in ('99495','99496'))and Year(cm.SERVICEDATEFROM) = Year(Getdate())) as [TCM], 
    (select max(cd.FROMDATESVC) from [dbo].[Claim_Masters] cm left join [dbo].[Claim_Details] cd on cm.claimno = cd.claimno and cm.MEMBID = x.MEMBID Where (Right(cd.PROCCODE,5) in ('99211','99212','99213','99214','99215','99201','99202','99203','99204','99205'))and Year(cm.SERVICEDATEFROM) = Year(Getdate())) as [Office], 
    (select max(cd.FROMDATESVC) from [dbo].[Claim_Masters] cm left join [dbo].[Claim_Details] cd on cm.claimno = cd.claimno and cm.MEMBID = x.MEMBID Where (Right(cd.PROCCODE,5) = '1170F')and Year(cm.SERVICEDATEFROM) = Year(Getdate())) as [FUNC], 
    (select max(cd.FROMDATESVC) from [dbo].[Claim_Masters] cm left join [dbo].[Claim_Details] cd on cm.claimno = cd.claimno and cm.MEMBID = x.MEMBID Where (Right(cd.PROCCODE,5) in ('1157F','1158F'))and Year(cm.SERVICEDATEFROM) = Year(Getdate())) as [ACP], 
    (select max(cd.FROMDATESVC) from [dbo].[Claim_Masters] cm left join [dbo].[Claim_Details] cd on cm.claimno = cd.claimno and cm.MEMBID = x.MEMBID Where (Right(cd.PROCCODE,5) in ('0521F','1125F','1126F'))and Year(cm.SERVICEDATEFROM) = Year(Getdate())) as [PAIN], 
    (select max(cd.FROMDATESVC) from [dbo].[Claim_Masters] cm left join [dbo].[Claim_Details] cd on cm.claimno = cd.claimno and cm.MEMBID = x.MEMBID Where (Right(cd.PROCCODE,5) in ('99605','99606','1160F','1111F','1159F'))and Year(cm.SERVICEDATEFROM) = Year(Getdate())) as [MTM] 
FROM 
    [dbo].[MEMB_COMPANY] X 
LEFT JOIN 
    [dbo].[PROV_COMPANY] Y ON X.PCP = Y.PROVID 
JOIN 
    [dbo].[PROV_ADDINFO] PA ON Y.PROV_MPI_NO = PA.PROV_MPI_NO 
          AND (PA.EDI_DEFAULT = 1) 
WHERE 
    (ISNULL(x.OPTHRUDT, '') = '' OR 
    x.OPTHRUDT > GETDATE()) 
    AND X.HPCODE = 'CHPS' 
+0

Verwendung 'JOIN' ???? – Ravi

+0

Sind Sie sicher, dass Sie verstehen, was Ihr Ziel ist? Kann ein Mitglied mehrere Ansprüche haben? Wenn dies möglich ist, können (können) Ihre Unterabfragen Daten aus unterschiedlichen Ansprüchen abrufen, da Sie diese nur anhand der Mitglieds-ID korrelieren. Ein Anspruch könnte also TCM liefern, während ein anderer ACP liefert. – SMor

+0

Diese Abfrage scheint nicht unterstützt zu werden. Denke ein oder zwei Monate später an deine Kollegen oder dich selbst. – svgrafov

Antwort

0

Ich gehe davon aus, dass Sie 1: M Beziehung zwischen MEMB_COMPANY und PROV_COMPANY und 1: M Beziehung zwischen PROV_COMPANY und PROV_ADDINFO. Dann sollte es möglich sein, Ihre Unterabfragen mit GROUP BY und conditional aggregation neu zu schreiben. So etwas wie die folgende Abfrage. Ich habe nur die ersten beiden Unterabfragen umgeschrieben. Ich denke, die Idee ist klar.

SELECT 
    x.HPCODE as [Health Plan] 
    ,x.HPFROMDT as [Eff Date] 
    ,x.MEMBID AS [ID #] 
    ,x.LASTNM as [Mbr L Name] 
    ,x.FIRSTNM as [Mbr F Name] 
    ,x.BIRTH as DOB 
    ,datediff(year,birth,getdate()) as Age 
    ,x.PCP as [Prov ID#] 
    ,Y.LASTNAME as [Prov L Name] 
    ,Y.FIRSTNAME as [Prov F Name] 
    ,PA.PHONE as [Provider Phone] 
    ,max(CASE WHEN left(cd.PROCCODE,5) in ('G0402','G0438','G0439') and Year(cm.SERVICEDATEFROM) = Year(Getdate()) THEN cd.FROMDATESVC END) 
    ,max(CASE WHEN left(cd.PROCCODE,5) in ('G0402','G0438','G0439') or Right(cd.PROCCODE,5) in ('99490','99487','99489') and Year(cm.SERVICEDATEFROM) = Year(Getdate()) THEN cd.FROMDATESVC END) 
    -- the subsequent conditions follows 
FROM [dbo].[MEMB_COMPANY] X 
LEFT JOIN [dbo].[PROV_COMPANY] Y ON X.PCP = Y.PROVID 
Join [dbo].[PROV_ADDINFO] PA ON Y.PROV_MPI_NO = PA.PROV_MPI_NO and (PA.EDI_DEFAULT = 1) 
LEFT JOIN [dbo].[Claim_Masters] cm ON cm.MEMBID = x.MEMBID 
LEFT JOIN [dbo].[Claim_Details] cd on cm.claimno = cd.claimno 
WHERE (isnull(x.OPTHRUDT, '') = '' or x.OPTHRUDT > GETDATE()) and X.HPCODE = 'CHPS' 
GROUP BY x.MEMBID, x.HPCODE ,x.HPFROMDT, x.LASTNM, x.FIRSTNM, x.BIRTH, x.PCP, Y.LASTNAME, Y.FIRSTNAME, PA.PHONE 

ich das Gefühl, dass Ihre Anfrage als auch beschleunigt werden könnte, wenn man die left(cd.PROCCODE,5) und right(cd.PROCCODE,5) Werte in der Tabelle vorauszuberechnen.

0

Subqueries sind oft langsam ... Sie sollten versuchen, sie mit einer Syntax wie zu vermeiden:

SELECT 
     x.HPCODE as [Health Plan] 
     ,x.HPFROMDT as [Eff Date] 
     ,x.MEMBID AS [ID #] 
     ,x.LASTNM as [Mbr L Name] 
     ,x.FIRSTNM as [Mbr F Name] 
     ,x.BIRTH as DOB 
     ,datediff(year,birth,getdate()) as Age 
     ,x.PCP as [Prov ID#] 
     ,Y.LASTNAME as [Prov L Name] 
     ,Y.FIRSTNAME as [Prov F Name] 
     ,PA.PHONE as [Provider Phone] 
     ,MAX(CASE WHEN left(cd.PROCCODE,5) in ('G0402','G0438','G0439') THEN cd.FROMDATESVC ELSE NULL END) as [AWV] 
     ,MAX(CASE WHEN left(cd.PROCCODE,5) in ('G0402','G0438','G0439') or Right(cd.PROCCODE,5) in ('99490','99487','99489') THEN cd.FROMDATESVC ELSE NULL END) as [CCM] 
     ,MAX(CASE WHEN Right(cd.PROCCODE,5) in ('99495','99496') THEN cd.FROMDATESVC ELSE NULL END) as [TCM] 
     ,MAX(CASE WHEN Right(cd.PROCCODE,5) in ('99211','99212','99213','99214','99215','99201','99202','99203','99204','99205') THEN cd.FROMDATESVC ELSE NULL END) as [Office] 
     ,MAX(CASE WHEN Right(cd.PROCCODE,5) = '1170F' THEN cd.FROMDATESVC ELSE NULL END) as [FUNC] 
     ,MAX(CASE WHEN Right(cd.PROCCODE,5) in ('1157F','1158F') THEN cd.FROMDATESVC ELSE NULL END) as [ACP] 
     ,MAX(CASE WHEN Right(cd.PROCCODE,5) in ('0521F','1125F','1126F') THEN cd.FROMDATESVC ELSE NULL END) as [PAIN] 
     ,MAX(CASE WHEN Right(cd.PROCCODE,5) in ('99605','99606','1160F','1111F','1159F') THEN cd.FROMDATESVC ELSE NULL END) as [MTM] 
    FROM [dbo].[MEMB_COMPANY] X 
     LEFT JOIN [dbo].[PROV_COMPANY] Y ON (X.PCP = Y.PROVID) 
     INNER JOIN [dbo].[PROV_ADDINFO] PA ON (Y.PROV_MPI_NO = PA.PROV_MPI_NO and (PA.EDI_DEFAULT = 1)) 
     LEFT JOIN [dbo].[Claim_Masters] cm ON (cm.MEMBID = x.MEMBID 
     LEFT JOIN [dbo].[Claim_Details] cd ON (cm.claimno = cd.claimno) 
    where (isnull(x.OPTHRUDT, '') = '' or x.OPTHRUDT > GETDATE()) and X.HPCODE = 'CHPS' 
GROUP BY x.HPCODE,x.HPFROMDT,x.MEMBID,x.LASTNM,x.FIRSTNM,x.BIRTH,datediff(year,birth,getdate()),x.PCP,Y.LASTNAME,Y.FIRSTNAME,PA.PHONE 
+0

Ich glaube, Sie vermissen die 'GROUP BY'-Klausel ... –

+0

oops, danke ^^ – clementakis

Verwandte Themen