2016-12-06 180 views
0

出於某種原因,當這是0它不會說0或甚至給一個空值,它只是沒有返回任何東西(附加屏幕截圖)替換SQL中的空白單元格?

我怎樣才能得到這個返回0呢?有人可以解釋爲什麼會發生這種情況嗎?

select 
    cast(PatientClass as varchar) + ' - ' + cast([Counted] as varchar) [Procedures Split] 
from 
    (select 
     PatientClass, COUNT(*) as [Counted] 
    from 
     (SELECT      
       NELCal.LastDayOfWeek, S.FaciltyID, 
       PP.EncounterRecno, PP.ProcedureSequence, 
       S.[AdmissionDate], S.AdmissionConsultantName, S.AdmissionMethod, 
       s.LengthOfSpell, 
       year(S.[AdmissionDate]) as AdmYear, 
       month(S.[AdmissionDate]) as AdmMonth, 
       PP.[ProcedureDate], 
       year(PP.[ProcedureDate]) as ProcYear, 
       month(PP.[ProcedureDate]) as ProcMonth, 
       S.Age, S.[AdmissionSpecialty(Function)], 
       S.[PatientClass], s.[AdmissionSpecialty(Main)], 
       PP.[ProcedureCode], PP.[Procedure] 
      FROM 
       [WHREPORTING].[APC].[Spell] S     
      LEFT JOIN 
       [WHREPORTING].[APC].[Episode] E ON S.SourceSpellNo = E.SourceSpellNo     
      LEFT JOIN 
       [WHREPORTING].[APC].[AllProcedures] PP ON E.EpisodeUniqueID = PP.EpisodeSourceUniqueID 
      LEFT JOIN 
       WHREPORTING.APC.Patient P ON P.EncounterRecno = S.EncounterRecno 
      JOIN 
       WHREPORTING.LK.Calendar AS NELCal ON PP.ProcedureDate = NELCal.TheDate      
               AND pp.ProcedureDate between '05 dec 2016' and '06 dec 2016'    
      --and NELCal.LastDayOfWeek between DATEADD(DAY,-7*52,cast(GETDATE() as DATE))     
      --and DATEADD(DAY,-1,cast(GETDATE() as DATE))     
      WHERE     
       [AdmissionSpecialty(Function)] = 'Breast Surgery') f   
    group by 
     PatientClass) g 

enter image description here

+0

這可能是因爲你已經有了一個GROUP BY,但有可能是沒什麼組 - 如果你將組帶走,是否有行要分組? – Cato

+0

您正在調用可能不包含任何記錄的派生表上的COUNT聚合;這將導致沒有返回。 – Chriz

+0

您需要選擇您感興趣的所有不同'PatientClass',然後將其添加到您選擇的所有記錄中,然後計算右邊的表(可能爲空 - 不計算空值),則可以獲得零對於零行「PatientClass」 - 卡託剛纔 – Cato

回答

1

您可以用case statment做到這一點

CASE WHEN yourfield = '' THEN 0 ELSE yourfield 

如果沒有記錄在所有返回,你能做到這一點

IF NOT EXISTS(select 
    cast(PatientClass as varchar) + ' - ' + cast([Counted] as varchar) [Procedures Split] 
from 
    (select 
     PatientClass, COUNT(*) as [Counted] 
    from 
     (SELECT      
       NELCal.LastDayOfWeek, S.FaciltyID, 
       PP.EncounterRecno, PP.ProcedureSequence, 
       S.[AdmissionDate], S.AdmissionConsultantName, S.AdmissionMethod, 
       s.LengthOfSpell, 
       year(S.[AdmissionDate]) as AdmYear, 
       month(S.[AdmissionDate]) as AdmMonth, 
       PP.[ProcedureDate], 
       year(PP.[ProcedureDate]) as ProcYear, 
       month(PP.[ProcedureDate]) as ProcMonth, 
       S.Age, S.[AdmissionSpecialty(Function)], 
       S.[PatientClass], s.[AdmissionSpecialty(Main)], 
       PP.[ProcedureCode], PP.[Procedure] 
      FROM 
       [WHREPORTING].[APC].[Spell] S     
      LEFT JOIN 
       [WHREPORTING].[APC].[Episode] E ON S.SourceSpellNo = E.SourceSpellNo     
      LEFT JOIN 
       [WHREPORTING].[APC].[AllProcedures] PP ON E.EpisodeUniqueID = PP.EpisodeSourceUniqueID 
      LEFT JOIN 
       WHREPORTING.APC.Patient P ON P.EncounterRecno = S.EncounterRecno 
      JOIN 
       WHREPORTING.LK.Calendar AS NELCal ON PP.ProcedureDate = NELCal.TheDate      
               AND pp.ProcedureDate between '05 dec 2016' and '06 dec 2016'    
      --and NELCal.LastDayOfWeek between DATEADD(DAY,-7*52,cast(GETDATE() as DATE))     
      --and DATEADD(DAY,-1,cast(GETDATE() as DATE))     
      WHERE     
       [AdmissionSpecialty(Function)] = 'Breast Surgery') f   
    group by 
     PatientClass) g) 

SELECT 0 AS [Procedures Split] 
ELSE 
select 
    cast(PatientClass as varchar) + ' - ' + cast([Counted] as varchar) [Procedures Split] 
from 
    (select 
     PatientClass, COUNT(*) as [Counted] 
    from 
     (SELECT      
       NELCal.LastDayOfWeek, S.FaciltyID, 
       PP.EncounterRecno, PP.ProcedureSequence, 
       S.[AdmissionDate], S.AdmissionConsultantName, S.AdmissionMethod, 
       s.LengthOfSpell, 
       year(S.[AdmissionDate]) as AdmYear, 
       month(S.[AdmissionDate]) as AdmMonth, 
       PP.[ProcedureDate], 
       year(PP.[ProcedureDate]) as ProcYear, 
       month(PP.[ProcedureDate]) as ProcMonth, 
       S.Age, S.[AdmissionSpecialty(Function)], 
       S.[PatientClass], s.[AdmissionSpecialty(Main)], 
       PP.[ProcedureCode], PP.[Procedure] 
      FROM 
       [WHREPORTING].[APC].[Spell] S     
      LEFT JOIN 
       [WHREPORTING].[APC].[Episode] E ON S.SourceSpellNo = E.SourceSpellNo     
      LEFT JOIN 
       [WHREPORTING].[APC].[AllProcedures] PP ON E.EpisodeUniqueID = PP.EpisodeSourceUniqueID 
      LEFT JOIN 
       WHREPORTING.APC.Patient P ON P.EncounterRecno = S.EncounterRecno 
      JOIN 
       WHREPORTING.LK.Calendar AS NELCal ON PP.ProcedureDate = NELCal.TheDate      
               AND pp.ProcedureDate between '05 dec 2016' and '06 dec 2016'    
      --and NELCal.LastDayOfWeek between DATEADD(DAY,-7*52,cast(GETDATE() as DATE))     
      --and DATEADD(DAY,-1,cast(GETDATE() as DATE))     
      WHERE     
       [AdmissionSpecialty(Function)] = 'Breast Surgery') f   
    group by 
     PatientClass) g 
+0

嗨,我試過這個,但它仍然沒有給我什麼迴應? – jd8766

+0

在這種情況下,沒有記錄我會更新我的答案 –

+0

幾乎加倍服務器的工作。 –

1

我猜測,一個的子查詢沒有返回任何記錄。這意味着你的結果集將完全清空(甚至不爲空)。

如果結果爲空,則無法使用字段(即您的演員陳述)。首先,您需要檢查IF EXISTS ...

0

最簡單的辦法是使用合併功能類似這樣:

select Coalesce(Table.Field,0) as columnResult