2012-01-06 103 views
1

目前,我有2个疑问:SQL联接查询援助

 
SELECT dateadd(month, x.MonthOffset,0) as [Month], SUM(x.itemcount) as [Total] FROM 
    (SELECT datediff(month,0, cna.impdate) as MonthOffset, count(*) as itemcount FROM myTable 
     WHERE (emergency = 'Emergency') AND (impdate BETWEEN '" + fromDate + "' AND '" + toDate + "') 
     GROUP BY impdate) x 
     GROUP BY MonthOffset ORDER BY MonthOffset asc 

SELECT dateadd(month, x.MonthOffset,0) as [Month], SUM(x.itemcount) as [Total] FROM 
    (SELECT datediff(month,0, cna.impdate) as MonthOffset, count(*) as itemcount FROM myTable 
     WHERE (impdate BETWEEN '" + fromDate + "' AND '" + toDate + "') 
     GROUP BY impdate) x 
     GROUP BY MonthOffset ORDER BY MonthOffset asc 

这将返回数据的2列与项目每月计数。

我的问题发生在存在一个月没有紧急项目时。因为我将对象传递给第二个查询,如果从第一个检索到的列数与第二个查询不匹配,我将收到索引超出界限的错误。

如何将两个查询结合在一起,以便我可以有3列 - 月份,紧急总数和项目总数?紧急事件总数可以是0或null。

回答

4

我没有测试它的一种方式,但我认为这应该给你你在找什么:

SELECT dateadd(month, datediff(month,0, cna.impdate),0) as [Month], 
     count(*) as itemcount, 
     SUM(CASE WHEN emergency = 'Emergency' THEN 1 ELSE 0 END) AS EmergencyCount 
FROM myTable 
WHERE impdate BETWEEN '" + fromDate + "' AND '" + toDate + "' 
GROUP BY dateadd(month, datediff(month,0, cna.impdate),0) 
ORDER BY [Month] asc 
+1

好的报价,它使得这两个方面,多少是突发事件都在每一个行月。应该很简单,让yookd做他需要的任何东西... – DRapp 2012-01-06 20:25:37

+0

我不知道CASE表达式。谢谢你,这简单而优雅。 – 2012-01-06 20:44:53