透视分类数据

时间:2017-03-09 14:22:51

标签: sql sql-server sql-server-2008

我有一组数据;类别,日期,字符串和两个值。有关此数据如何在下面的简化示例:

|  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            | ... |

这是一个按日期分组的表格,每个总数是每个类别的值的总和。

我将如何实现这一目标?

1 个答案:

答案 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脚本。请参阅以下链接:

Simplify Dynamic SQL Pivot Table