透视转换

透视数据(pivoting)是一种把数据从行的状态旋转为列的状态的处理,在这个过程中可能需要对值进行聚合。

每个透视转换将涉及三个逻辑处理阶段,每个阶段都有相关的元素:分组阶段处理相关的分组或行元素,扩展(spreading)阶段处理相关的扩展或列元素,聚合阶段处理相关的聚合元素和聚合函数。总之,透视转换涉及分组、扩展及聚合三个阶段。

使用标准SQL 进行透视转换

SELECT empid

  SUM(CASE WHEN custid='A' THEN qty END) AS A,

  SUM(CASE WHEN custid='B' THEN qty END) AS B

FROM dbo.Orders

GROUP BY empid;

使用 T-SQL PIVOT 运算符进行透视转换

SQL Server 2005 引入了一个T-SQL 特有的表运算符——PIVOT,和其他表运算符(如,JOIN )类似,PIVOT 运算符也是在查询的FROM子句的上下文中操作。它对某个源表或表表达式进行操作、透视数据,再返回一个结果表。PIVOT 运算符同样涉及前面介绍的三个逻辑处理阶段(分组、扩展及聚合)和同样的透视转换元素,但使用的是不同的、SQL Server原生的(native)的语法。

注意:对于PIVOT去处符有个重要的地方需要注意,不需要为它地指定分组元素,也就不需要在查询中使用 GROUP BY子句。PIVOT 运算符隐式地把源表(或表表达式)中既没有指定为扩展元素,也没有指定为聚合元素的那些元素作为分组元素。所以在使用 PIVOT 运算符时,需要保证 PIVOT 运算符的源表除了分组、扩展和聚合元素以外,不能再包含其他属性(列)。以便在指定了扩展元素和聚合元素以后,剩下的属性全部都是欲指定为分组元素的属性。为此,一般不直接把PIVOT 运算符应用到源表,而是将其应用到一个表表达式(该表表达式只包含透视转换需要的3种元素,不包含其他属性)。

with temp as
(
select
 'a' as col1,
 'b' as col2,
 '2' as col3
union
select
 'a' as col1,
 'c' as col2,
 '3' as col3
)
select col1,b,c
from temp as t
pivot (max(col3) for col2 in(b,c)) as  p

强烈建议不要直接对基础表进行操作,即使表中只包含用于透视转换的列。我们无法预测将来是否会向表中添加新列,从而让查询生成不正确的结果。所以,建议应该使用表表达式作为PIVOT 运算符的输入表,甚至可以将其视为该运算符的语法要求。

原文地址:https://www.cnblogs.com/zhangdx/p/3735970.html