想象一下这样的数据集:
create table #temp (id int, value_band nvarchar(99), date-band nvarchar(99))
ID Value_Band Date_Band
1234 0-5 0-12
3466 0-5 13-24
4682 5-15 13-24
3468 15-25 24-36
3457 5-15 36+
3579 25+ 0-12
..等等:我大约有80,000条记录。
使用GROUP BY
来获取每个频段的总计数非常容易。但是,我被要求将每种类型的总计数分解为网格,如下所示:
Value_Band
Date_Band 0-5 5-15 15-25 25+
0-12
13-24
24-36
36+
因此,如果有4,000条Date_Band为0-12的记录,并且恰好是每个可能的value_band的千分之一,那么每一行的顶行将有1,000个。
虽然我可以零碎地做到这一点 - 弄清楚每个方框中的内容 - 我很想知道是否有一个语句可以产生这个结果集。
我确信这是一个常见的问题/要求,答案很简单。但是我看到的现有答案依赖于其中一个网格轴作为单独的列存在,而这些数据并非如此。
答案 0 :(得分:1)
PIVOT通过将表达式中一列中的唯一值转换为输出中的多个列来旋转表值表达式,并在需要的任何剩余列值上执行聚合在最后的输出中。
这就是你需要的。
SELECT
date_band,
[0-5],
[5-15],
[15-25],
[25+]
FROM (
-- Subquery to retrieve the required columns
SELECT
id, value_band, date_band
FROM
temp
) T
PIVOT (
-- Aggregation
COUNT(id)
-- The column to rotate and the list of values you want to show (listed as columns)
FOR value_band IN ([0-5], [5-15], [15-25], [25+])
) P
这是另一个没有PIVOT
的解决方案:
SELECT
date_band,
SUM(CASE WHEN value_band = '0-5' THEN 1 ELSE 0 END) AS [0-5],
SUM(CASE WHEN value_band = '5-15' THEN 1 ELSE 0 END) AS [5-15],
SUM(CASE WHEN value_band = '15-25' THEN 1 ELSE 0 END) AS [15-25],
SUM(CASE WHEN value_band = '25+' THEN 1 ELSE 0 END) AS [25+]
FROM
temp
GROUP BY
date_band
请注意,在每种情况下,您都必须知道要旋转的值。