2016-09-27 26 views
0

我有一个表格,它每小时记录一周的数据。多个列上的SQL Server支点

这是(一天)的表结构:

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 

我已经使用枢轴看到如下天逐量分布:

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 

输出:

enter image description here

现在,我需要包括数量分配类别列表。我的预期产出将是,

enter image description here

如何acheive上述结果。请帮助...

+0

请以文字形式发布结果 – TheGameiswar

回答

5

只需使用条件汇总:

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; 
+0

感谢您的帮助。但我每天大约有20个小时..条件聚合使代码更长..有其他解决方法。 – bmsqldev

1

如果你想动态支点,你可以使用波纹管查询

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 

注:输出列是不是在正确的顺序