2012-01-06 20 views
1

に参加し、現在、私は2つのクエリがあります。これは、アイテムの毎月の数とデータの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番目のクエリに渡すので、最初のクエリから取得された列の数が2番目のクエリの数と一致しないと、範囲外のインデックスのエラーが表示されます。

月間、緊急時合計、アイテム合計の3つの列を持つことができるように、2つのクエリを一緒に参加させるにはどうすればよいですか?緊急の合計は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

良いのオファー緊急事態は、すべて1行あたりにあったどのように多くの月。彼が必要とするものは何でもするためにyookdのために非常に簡単でなければならない... – DRapp

+0

私はCASE式について知らなかった。ありがとう、それはシンプルでエレガントです。 –