如何根据 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
运算符的对应语法。
我有一个像
这样的数据集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
运算符的对应语法。