当IN没有返回任何值sql时如何显示零

时间:2014-08-08 07:20:58

标签: sql sql-server-2008

如果找不到以下条件的行,我想返回0。

SELECT P.externalid,
       Count(DISTINCT Pp.patientuid) patcount
FROM   PatientProcedure Pp (nolock )
       INNER JOIN visit Temp (nolock )
               ON Temp.patientuid = Pp.patientuid
                  AND (Pp.effectivedate = Temp.VisitDate)
                  AND Temp.RenderringProviderUid = Pp.serviceprovideruid
                  AND Temp.VisitDate >= '07-01-2013'
                  AND Temp.VisitDate <= '06-30-2014'
       INNER JOIN serviceprovider Sp (nolock )
               ON Pp.serviceprovideruid = Sp.serviceprovideruid
                  AND Sp.inactive = 0
       INNER JOIN MasterCode Mc (nolock )
               ON Mc.codeuid = Pp.procedurecodeuid
       INNER JOIN MasterCodeSet Mcs (nolock )
               ON Mcs.Value = Mc.code
       INNER JOIN practice P
               ON P.PracticeUid = Temp.practiceuid
WHERE  NAME = 'Visual_Field_Exam'
       AND Temp.mastervisittypeuid IS NOT NULL
       AND P.ExternalID IN ('26900', '26902', '26903', '26906',
                            '26907', '26908', '26946', '26963',
                            '27128', '27131', '27133', '27134',
                            '27135', '27137', '27166', '27167',
                            '27497', '27498', '27499', '27501',
                            '27502', '27504', '27505', '27509',
                            '27510', '27511', '27518')
GROUP  BY P.ExternalID

我发现许多诊所都有患者,但没有患者找到一种做法。所以,我想为这种做法返回count(patientuid)= 0。

以下是样本数据。

PracticeId  Patcount
26900   2583
26902   826
26903   4085
26906   241
26907   3205
26908   4592
26946   344
26963   398
27128   238
27131   2467
27133   975
27135   815
27137   1252
27166   1038
27167   211
27497   1053
27498   934
27499   3467
27501   617
27502   3511
27504   7222
27505   683
27509   210
27510   1145
27511   181
27518   500

在上面的输出中,我得到了26个练习的数据,但是&#34; 27134&#34;练习没有患者数,所以我希望它显示为0.

我想要上面的输出。我怎样才能实现它?

提前致谢..!

1 个答案:

答案 0 :(得分:1)

假设你有一个表Practicer来保存练习者(我不知道这是不是正确的单词,但对于SQL并不重要)。然后,您需要将该表与Patient连接起来,以便获得所有练习者的列表过滤器where where子句。所以这将得到你想要的。

Select PR.PracticeName, 
       count(distinct patientid) 
from   Practicer PR
       LEFT JOIN Patient P
           ON PR.Practiceid = P.Practiceid
where  PR.Practiceid in
       ('12345','65478','78541')
GROUP BY PR.PracticeName

通常,您希望返回2个字段。第一个是HospitalsPractiotioners或您可能喜欢的任何其他内容的列表。为了获得完整列表(即使它没有计数),您需要从该表开始。

让我们说我们有一个表Hospitals,我们想要过滤特定的ID。我们将得到以下查询:

SELECT  HospitalId, 
        HospitalName
FROM    Hospitals
WHERE   HospitalId IN ('26900', '26902', '26903')

现在我们想知道每家医院的患者人数。我们知道id为#26902&#39;没有病人(WOW)。如果我们转到Patients表并尝试以下内容:

SELECT   HospitalId, 
         COUNT(*) AS NoOfPatients
FROM     Patients
WHERE    HospitalId IN ('26900', '26902', '26903')
GROUP BY HospitalId

它只返回ID&#39; 26900&#39;和&#39; 26903&#39;作为id为&#39; 26902&#39;没有任何病人。

那么,我们如何找出第三家医院?

我们加入了两个表:

SELECT   H.HospitalId, 
         COUNT(PatienId) AS NoOfPatients
FROM     Hospitals H
         LEFT JOIN Patients P
WHERE    H.HospitalId IN ('26900', '26902', '26903')
GROUP BY H.HospitalId

现在这将使所有要求的医院返回相应数量的患者。

您的情况更复杂,因为我们需要从HospitalsPatients表的更多连接。但我希望我的解释会让你走上正轨。

它的本质是从List Table开始到Count表。