2013-03-14 76 views
2

我有这样的MS SQL 2005查询:MSSQL 2005查询组日期 - 甚至没有记录的日期?

SELECT 
    DATEDIFF(dd, getdate(), CreatedOn) as Day, 
    COUNT(CreatedOn) as 'Active Cases' 
FROM 
    [dbo].[IncidentBase] 
WHERE 
    (StatusCode != 6 AND StatusCode != 5) 
    AND (CaseTypeCode = '200000' OR CaseTypeCode = '200005' OR CaseTypeCode = '200006') 
GROUP BY 
    DATEDIFF(dd, getdate(), CreatedOn) 
ORDER BY 
    Day DESC 

,并返回这样的事情:

-1 10 
-2 6 
-5 4 
-7 8 

我真的想它是这样的:

-1 10 
-2 6 
-3 0 
-4 0 
-5 4 
-6 0 
-7 8 

(之间插入零日期没有记录)

我该怎么做?

非常感谢提前!

回答

2

尝试外部连接的子查询返回的所有日期

SELECT table_cal.day_diff as "Day", 
    COALESCE(table_count.base_count,0) as "Active Cases" 
FROM 
(SELECT DISTINCT DATEDIFF(dd, getdate(), ibase.CreatedOn) as day_diff 
    FROM [dbo].[IncidentBase] ibase) table_cal 
LEFT OUTER JOIN 
(SELECT DATEDIFF(dd, getdate(), ibase.CreatedOn) as day_diff, 
    COUNT(ibase.CreatedOn) as base_count 
    FROM [dbo].[IncidentBase] ibase 
    WHERE ibase.StatusCode NOT IN (5,6) AND ibase.CaseTypeCode IN ('200000','200005','200006') 
    GROUP BY DATEDIFF(dd, getdate(), ibase.CreatedOn)) table_count 
ON (table_cal.day_diff = table_count.day_diff) 
ORDER BY table_cal.day_diff DESC 

背后的想法很简单。您需要一个子查询来生成现有日期的列表,另一个用于生成结果值。然后你外连接并且用0替换空值。

+0

谢谢你的回答。虽然不是很有效 - 它只是将“活动案例”与10倍相乘。请您仔细检查一下? – user1281991 2013-03-14 08:07:41

+0

我已经更新了它。由于我没有样本数据,我无法真正检查 – 2013-03-14 08:18:29

+0

我非常感谢您的努力,我认为它现在非常接近。请参阅:http://gratisupload.dk/billede/thumb/693353/full/ – user1281991 2013-03-14 08:33:17