2016-01-28 117 views
0

我有4個表存儲4種請求:延時(TO),會議(MT),訂單和旅行(TR)。如何在計數查詢結果中包含0

我要計算每個表中每種類型的請求總數在過去30天:

SELECT [requestType], COUNT ([requestType]) As 'Count' 
    FROM [Timeoff] 
    WHERE [requestType] = 'TO' AND CAST([timeoffCreatedTime] AS DATE) >= CAST(DateAdd(DAY,-30,Getdate()) AS DATE) GROUP BY [requestType] 
    UNION ALL 
    SELECT [requestType], COUNT ([requestType]) As 'Count' 
    FROM [Meeting] 
    WHERE [requestType] = 'MT' AND CAST([meetingCreatedTime] AS DATE) >= CAST(DateAdd(DAY,-30,Getdate()) AS DATE) GROUP BY [requestType] 
    UNION ALL 
    SELECT [requestType], COUNT ([requestType]) As 'Count' 
    FROM [PO] 
    WHERE [requestType] = 'PO' AND CAST([poCreatedTime] AS DATE) >= CAST(DateAdd(DAY,-30,Getdate()) AS DATE) GROUP BY [requestType] 
    UNION ALL 
    SELECT [requestType], COUNT ([requestType]) As 'Count' 
    FROM [Travel] 
    WHERE [requestType] = 'TR' AND CAST([travelCreatedTime] AS DATE) >= CAST(DateAdd(DAY,-30,Getdate()) AS DATE) GROUP BY [requestType] 

問題是,如果計數爲0,那麼它不會在結果顯示在所有,例如,如果會議請求的數量= 0,那麼我唯一有此作爲的結果:

enter image description here

怎樣包括在結果中的0值,所以我有類似的東西(如會議MT數= 0):

的RequestType ---計數

TO ------------- 30

MT ------------- 0

PO ------------- 19

TR ------------- 9

+0

你爲什麼要寫Group By子句? 我認爲這不需要,因爲我的書面解決方案 –

回答

1

你必須從你的查詢中刪除GROUP BY,它不需要! 你的查詢應該只是:

SELECT 'TO' AS [requestType], COUNT ([requestType]) As 'Count' 
    FROM [Timeoff] 
    WHERE [requestType] = 'TO' AND CAST([timeoffCreaime] ATE) >= CASt(DAY,-30,Gte()) ATE) 
    UNION ALL 
    SELECT 'Meeting' AS [requestType], COUNT ([requestType]) As 'Count' 
    FROM [Meeting] 
    WHERE [requestType] = 'Meeting' AND CAST([meetingCreaime] ATE) >= CASt(DAY,-30,Gte()) ATE) 
    UNION ALL 
    SELECT 'PO' AS [requestType], COUNT ([requestType]) As 'Count' 
    FROM [PO] 
    WHERE [requestType] = 'PO' AND CAST([poCreaime] ATE) >= CASt(DAY,-30,Gte()) ATE) 
    UNION ALL 
    SELECT 'TR' AS [requestType], COUNT ([requestType]) As 'Count' 
    FROM [Travel] 
    WHERE [requestType] = 'TR' AND CAST([travelCreaime] ATE) >= CASt(DAY,-30,Gte()) ATE) 
+0

它已經這樣硬編碼,他需要它在WHERE過濾器中,因爲我不知道他的業務邏輯。 –

+0

我回滾了編輯,使其恢復到原始狀態。爲了使你的代碼正常工作,你需要從select語句中刪除'RequestType',並對'RequestType'進行硬編碼。 –

+0

@AnupAgrawal爲什麼你編輯我的解決方案,其中包含requestType的編碼...然後要求這麼做? :) 羅納爾迪尼奧代碼工作正常,只需要刪除GROUP BY子句以獲得結果中的0計數。我認爲這應該是一個正確的答案。謝謝 –

0

您可以做一個外連接上每個查詢類似於(選擇1)

SELECT [requestType], COUNT ([requestType]) As 'Count' 
    FROM (select 1 as foo) bar 
    LEFT JOIN [CTEite].[dbo].[Timeoff] ON 1=1 
    WHERE [requestType] = 'TO' AND CAST([timeoffCreaime] ATE) >= CASt(DAY,- 

或UNION和總和

WITH foo AS(
SELECT 'TO' as [requestType], 0 as [Count] 
UNION ALL 
SELECT 'MT', 0 
UNION ALL 
.... 
) 
SELECT [requestType], sum([Count]) 
FROM 
(SELECT [requestType], COUNT ([requestType]) As 'Count' 
    FROM [CTEite].[dbo].[Timeoff] 
    WHERE [requestType] = 'TO' AND CAST([timeoffCreaime] ATE) >= CASt(DAY,-30,Gte()) ATE) GROUP BY [requestType] 
    UNION ALL 
    SELECT [requestType], COUNT ([requestType]) As 'Count' 
    FROM [CTEite].[dbo].[Meeting] 
    WHERE [requestType] = 'Meeting' AND CAST([meetingCreaime] ATE) >= CASt(DAY,-30,Gte()) ATE) GROUP BY [requestType] 
    UNION ALL 
    SELECT [requestType], COUNT ([requestType]) As 'Count' 
    FROM [CTEite].[dbo].[PO] 
    WHERE [requestType] = 'PO' AND CAST([poCreaime] ATE) >= CASt(DAY,-30,Gte()) ATE) GROUP BY [requestType] 
    UNION ALL 
    SELECT [requestType], COUNT ([requestType]) As 'Count' 
    FROM [CTEite].[dbo].[Travel] 
    WHERE [requestType] = 'TR' AND CAST([travelCreaime] ATE) >= CASt(DAY,-30,Gte()) ATE) GROUP BY [requestType] 
UNION SELECT * FROM foo) 
GROUP BY [requestType]