2014-11-24 68 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 

简单。