我有一组数据;类别,日期,字符串和两个值。有关此数据如何在下面的简化示例:
| Category | TheDate | TheString | TotalA | TotalB |
----------------------------------------------------------
| CatA | 01/01/01 | foo1 | 100 | 200 |
| CatA | 01/01/01 | foo2 | 100 | 200 |
| CatA | 01/01/01 | foo3 | 100 | 200 |
| CatA | 02/01/01 | foo4 | 100 | 200 |
| CatA | 02/01/01 | foo5 | 100 | 200 |
| CatA | 03/01/01 | foo6 | 100 | 200 |
| CatA | 04/01/01 | foo7 | 100 | 200 |
| CatB | 01/01/01 | foo8 | 100 | 200 |
| CatB | 01/01/01 | foo9 | 100 | 200 |
| CatB | 06/01/01 | foo2 | 100 | 200 |
我想透视这些数据,以便创建如下表格:
| TheDate | TotalAForCatA | TotalAForCatB | TotalBForCatA | ... |
-------------------------------------------------------------------
| 01/01/01 | 300 | 200 | 600 | ... |
| 02/01/01 | 200 | 0 | 400 | ... |
| 03/01/01 | 100 | 0 | 200 | ... |
| 04/01/01 | 100 | 0 | 200 | ... |
| 06/01/01 | 0 | 100 | 0 | ... |
这是一个按日期分组的表格,每个总数是每个类别的值的总和。
我将如何实现这一目标?
答案 0 :(得分:2)
数据样本
select theDate,
sum(case when category='CatA' then TotalA else 0 end) 'TotalAForCatA',
sum(case when category='CatB' then TotalA else 0 end) 'TotalAForCatB',
sum(case when category='CatA' then TotalB else 0 end) 'TotalBForCatA',
sum(case when category='CatB' then TotalB else 0 end) 'TotalBForCatB'
from table1
group by thedate
所有列都已知时的条件聚合
{{1}}
当您知道有固定数量的列时,您也可以使用PIVOT。
如果列不同,则需要创建并执行动态SQL脚本。请参阅以下链接: