如何根据 sql 中的月份将值的数量分组到列中

How can I group the number of values into columns based on month in sql

我有一个像

这样的数据集
Code Date 
123  21-Jan-2000 
234  23-Feb-1999 
123  19-Jan-2001

我想查询 table 来显示这样的数据:

Code Total (All months) Jan Feb ... Dec 
123    2                 1   1
234    1                 0   1

我真的不知道如何开始。非常感谢任何提示或帮助。

您想使用 PIVOT。来自 official documentation:

select * from (
   select times_purchased, state_code
   from customers t
)
pivot 
(
   count(state_code)
   for state_code in ('NY','CT','NJ','FL','MO')
)
order by times_purchased

所以在你的情况下,下面的查询:

select * from (
    select code, datepart(month, date) as month
      from #data
) as data
pivot 
(
    count(code)
     for month in ('1','2','3','4','5','6','7','8','9','10','11','12')
)

我们可以尝试一个数据透视查询:

SELECT
    Code,
    COUNT(Date) AS "Total (All months)",
    COUNT(CASE WHEN EXTRACT(MONTH FROM Date) = 1  THEN 1 END) AS Jan,
    COUNT(CASE WHEN EXTRACT(MONTH FROM Date) = 2  THEN 1 END) AS Feb,
    COUNT(CASE WHEN EXTRACT(MONTH FROM Date) = 3  THEN 1 END) AS Mar,
    COUNT(CASE WHEN EXTRACT(MONTH FROM Date) = 4  THEN 1 END) AS Apr,
    COUNT(CASE WHEN EXTRACT(MONTH FROM Date) = 5  THEN 1 END) AS May,
    COUNT(CASE WHEN EXTRACT(MONTH FROM Date) = 6  THEN 1 END) AS Jun,
    COUNT(CASE WHEN EXTRACT(MONTH FROM Date) = 7  THEN 1 END) AS Jul,
    COUNT(CASE WHEN EXTRACT(MONTH FROM Date) = 8  THEN 1 END) AS Aug,
    COUNT(CASE WHEN EXTRACT(MONTH FROM Date) = 9  THEN 1 END) AS Sep,
    COUNT(CASE WHEN EXTRACT(MONTH FROM Date) = 10 THEN 1 END) AS Oct,
    COUNT(CASE WHEN EXTRACT(MONTH FROM Date) = 11 THEN 1 END) AS Nov,
    COUNT(CASE WHEN EXTRACT(MONTH FROM Date) = 12 THEN 1 END) AS Dec
FROM yourTable
GROUP BY
    Code
ORDER BY
    Code;

请注意,上述显式主元语法通常可以胜过使用 PIVOT 运算符的对应语法。