SQL 多列服务器数据透视表
SQL Server pivot on multiple columns
我有一个 table 可以按小时存储一周的数据。
这是table结构(一天):
dayId HourId amount category
--------------------------------
1 9 1 a
1 9 1 b
1 9 1 c
1 9 1 d
1 10 1 a
1 10 1 b
1 10 1 c
1 10 1 d
1 11 1 a
1 11 1 b
1 11 0 c
1 11 1 d
1 12 0 a
1 12 2 b
1 12 2 c
1 12 2 d
我使用 pivot 来查看每天的金额分布,如下所示:
select
dayid,
[9],
[10],
[11],
[12]
from
(select dayid, hourid, isnull(amount, 0) as amountfrom #test) as c
pivot
(sum(amount) for hourid in ([9], [10], [11], [12])) as p
输出:
现在,我需要将类别添加到金额分配列表中。我的预期输出是,
如何实现上述结果。请帮忙...
只使用条件聚合:
select dayid,
sum(case when hourid = 9 then amount else 0 end) as [9],
sum(case when hourid = 9 and category = 'a' then amount else 0 end) as [a9],
sum(case when hourid = 9 and category = 'b' then amount else 0 end) as [b9],
. . .
from #test t
group by dayid;
如果你想要动态枢轴,你可以使用下面的查询
CREATE Table #Item(dayid int,CatId varchar(20),value int)
INSERT INTO #Item
select dayid,Convert(varchar,hourId),sum(amount) from data a group by dayid,hourId
INSERT INTO #Item
select dayid,Convert(varchar,hourid)+Category,sum(amount) from data a group by dayid,hourId,Category Order by hourId
DECLARE @Query AS NVARCHAR(MAX) DECLARE @ColumnName AS NVARCHAR(MAX)
SELECT @ColumnName= ISNULL(@ColumnName + ',','') + QUOTENAME(CatId)
FROM (SELECT DISTINCT CatId FROM #Item) AS Category
SET @Query = N'SELECT dayid' + @ColumnName + 'FROM #Item PIVOT(SUM(value) FOR CatId IN (' + @ColumnName + ')) AS PVTTable'
EXEC sp_executesql @Query
Drop table #Item
注意:输出列的顺序不正确
我有一个 table 可以按小时存储一周的数据。
这是table结构(一天):
dayId HourId amount category
--------------------------------
1 9 1 a
1 9 1 b
1 9 1 c
1 9 1 d
1 10 1 a
1 10 1 b
1 10 1 c
1 10 1 d
1 11 1 a
1 11 1 b
1 11 0 c
1 11 1 d
1 12 0 a
1 12 2 b
1 12 2 c
1 12 2 d
我使用 pivot 来查看每天的金额分布,如下所示:
select
dayid,
[9],
[10],
[11],
[12]
from
(select dayid, hourid, isnull(amount, 0) as amountfrom #test) as c
pivot
(sum(amount) for hourid in ([9], [10], [11], [12])) as p
输出:
现在,我需要将类别添加到金额分配列表中。我的预期输出是,
如何实现上述结果。请帮忙...
只使用条件聚合:
select dayid,
sum(case when hourid = 9 then amount else 0 end) as [9],
sum(case when hourid = 9 and category = 'a' then amount else 0 end) as [a9],
sum(case when hourid = 9 and category = 'b' then amount else 0 end) as [b9],
. . .
from #test t
group by dayid;
如果你想要动态枢轴,你可以使用下面的查询
CREATE Table #Item(dayid int,CatId varchar(20),value int)
INSERT INTO #Item
select dayid,Convert(varchar,hourId),sum(amount) from data a group by dayid,hourId
INSERT INTO #Item
select dayid,Convert(varchar,hourid)+Category,sum(amount) from data a group by dayid,hourId,Category Order by hourId
DECLARE @Query AS NVARCHAR(MAX) DECLARE @ColumnName AS NVARCHAR(MAX)
SELECT @ColumnName= ISNULL(@ColumnName + ',','') + QUOTENAME(CatId)
FROM (SELECT DISTINCT CatId FROM #Item) AS Category
SET @Query = N'SELECT dayid' + @ColumnName + 'FROM #Item PIVOT(SUM(value) FOR CatId IN (' + @ColumnName + ')) AS PVTTable'
EXEC sp_executesql @Query
Drop table #Item
注意:输出列的顺序不正确