2014-11-24 102 views
2

我有一個SQL Server 2005的表名爲Rentals統計查詢:的SQL Server 2005 GROUP BY和每月

RentalID 
Book 
Date 

我想返回,使用查詢,對於每本書,許多租賃是如何在每每年給定一年。

結果應該是這個樣子:

+--------------------------------+-----+-----+-----+ 
|    Book    | Jan | Feb | Mar | 
+--------------------------------+-----+-----+-----+ 
| Isaac Asimov - Foundation  | 2 | 5 | 3 | 
| H.G. Wells - War of the Worlds | 4 | 3 | 1 | 
| Frank Herbert - Dune   | 7 | 4 | 6 | 
+--------------------------------+-----+-----+-----+ 

我到目前爲止查詢:

SELECT 
Book, 
(SELECT COUNT(*) FROM Rentals WHERE month(Date)=1 AND year(Date)=2011), 
(SELECT COUNT(*) FROM Rentals WHERE month(Date)=2 AND year(Date)=2011), 
(SELECT COUNT(*) FROM Rentals WHERE month(Date)=3 AND year(Date)=2011), 
(SELECT COUNT(*) FROM Rentals WHERE month(Date)=4 AND year(Date)=2011), 
(SELECT COUNT(*) FROM Rentals WHERE month(Date)=5 AND year(Date)=2011), 
(SELECT COUNT(*) FROM Rentals WHERE month(Date)=6 AND year(Date)=2011), 
(SELECT COUNT(*) FROM Rentals WHERE month(Date)=7 AND year(Date)=2011), 
(SELECT COUNT(*) FROM Rentals WHERE month(Date)=8 AND year(Date)=2011), 
(SELECT COUNT(*) FROM Rentals WHERE month(Date)=9 AND year(Date)=2011), 
(SELECT COUNT(*) FROM Rentals WHERE month(Date)=10 AND year(Date)=2011), 
(SELECT COUNT(*) FROM Rentals WHERE month(Date)=11 AND year(Date)=2011), 
(SELECT COUNT(*) FROM Rentals WHERE month(Date)=12 AND year(Date)=2011) 
FROM Rentals 
GROUP BY Book 

回答

3

這可以通過使用聚合函數內部的CASE表達式來編寫簡單得多。此過程稱爲PIVOT:

select book, 
    sum(case when month(Date) = 1 then 1 else 0 end) Jan, 
    sum(case when month(Date) = 2 then 1 else 0 end) Feb, 
    sum(case when month(Date) = 3 then 1 else 0 end) Mar, 
    sum(case when month(Date) = 4 then 1 else 0 end) Apr, 
    sum(case when month(Date) = 5 then 1 else 0 end) May, 
    sum(case when month(Date) = 6 then 1 else 0 end) Jun, 
    sum(case when month(Date) = 7 then 1 else 0 end) Jul, 
    sum(case when month(Date) = 8 then 1 else 0 end) Aug, 
    sum(case when month(Date) = 9 then 1 else 0 end) Sep, 
    sum(case when month(Date) = 10 then 1 else 0 end) Oct, 
    sum(case when month(Date) = 11 then 1 else 0 end) Nov, 
    sum(case when month(Date) = 12 then 1 else 0 end) Dec 
from Rentals 
where year(date) = 2011 
group by book; 

請參閱SQL Fiddle with Demo。而不是每個列多次查詢表,您使用條件聚合來獲取每月和每年的每本書的計數。

+0

謝謝,bluefeet! – milo2011 2014-11-24 16:10:50

0

如果使用旋轉代碼更易於維護,

SELECT 
    BOOK, 
    [1] as Jan , 
    [2] as Feb, 
    [3] as Mar, 
    [4] as Apr, 
    [5] as May, 
    [6] as Jun, 
    [7] as Jul, 
    [8] as Aug, 
    [9] as Sep, 
    [10] as Oct, 
    [11] as Nov, 
    [12] as Dec 
FROM 
(
    SELECT 
     BOOK , 
     DATEPART(MONTH,[DATE]) AS PER 
    FROM 
     Rentals 
    WHERE 
     DATEPART(YEAR,[DATE]) = 2014 
) AS P PIVOT 
    (
    COUNT(PER) FOR PER IN ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12]) 
    ) AS DATA 

簡單。