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

注意:输出列的顺序不正确