【问题标题】:SQL Server 2005 GROUP BY and COUNT query for each monthSQL Server 2005 GROUP BY 和 COUNT 查询每个月
【发布时间】:2015-01-22 03:39:40
【问题描述】:

我有一个名为 Rentals 的 SQL Server 2005 表:

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

【问题讨论】:

    标签: sql sql-server sql-server-2005 pivot


    【解决方案1】:

    如果你使用pivot代码更容易维护,

    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
    

    简单。

    【讨论】:

      【解决方案2】:

      这可以通过在聚合函数中使用 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。您无需为每一列多次查询表,而是使用条件聚合来获取每本书在月份和年份中的计数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-12-19
        • 2011-04-18
        • 2014-05-06
        • 2020-08-15
        • 1970-01-01
        • 1970-01-01
        • 2011-11-21
        相关资源
        最近更新 更多