SQL Server 2005 中行列转换(Pivot 和 UNPivot的使用)
Posted on 2006-11-15 22:43 talantlee 阅读(2385) 评论(2) 编辑 收藏 举报
关于一般的行列转换(Sql2000)我们必须用 select ...case...语句
参照http://blog.csdn.net/talantlee/articles/353798.aspx
针对sql2005 系统提供两个新的关键字 PIVOT 和UNPIVOT可用来作此类操作.
语法规则
<pivot_clause> ::=
( aggregate_function ( value_column )
FOR pivot_column
IN ( <column_list> )
)
<unpivot_clause> ::=
( value_column FOR pivot_column IN ( <column_list> ) )
table_source PIVOT <pivot_clause>
指定基于 table_source 对 pivot_column 进行透视。table_source 是表或表表达式。输出是包含 table_source 中 pivot_column 和 value_column 列之外的所有列的表。table_source 中 pivot_column 和 value_column 列之外的列被称为透视运算符的组合列。
PIVOT 对输入表执行组合列的分组操作,并为每个组返回一行。此外,input_table 的 pivot_column 中显示的 column_list 中指定的每个值,输出中都对应一列。
有关详细信息,请参阅“备注”部分和使用 PIVOT 和 UNPIVOT。
aggregate_function
系统或用户定义的聚合函数。聚合函数应该对空值固定不变。对空值固定不变的聚合函数在求聚合值时不考虑组中的空值。
不允许使用 COUNT(*) 系统聚合函数。
value_column
PIVOT 运算符的值列。与 UNPIVOT 一起使用时,value_column 不能是输入 table_source 中的现有列的名称。
FOR pivot_column
PIVOT 运算符的透视列。pivot_column 必须属于可隐式或显式转换为 nvarchar() 的类型。此列不能为 image 或 rowversion。
使用 UNPIVOT 时,pivot_column 是从 table_source 中提取的输出列的名称。table_source 中不能有该名称的现有列。
IN ( column_list )
在 PIVOT 子句中,列出 pivot_column 中将成为输出表的列名的值。该列表不能指定被透视的输入 table_source 中已存在的任何列名。
在 UNPIVOT 子句中,列出 table_source 中将被提取到单个 pivot_column 中的列。
建立测试环境
CREATE TABLE pvt (VendorID int, Emp1 int, Emp2 int,
Emp3 int, Emp4 int, Emp5 int)
GO
INSERT INTO pvt VALUES (1,4,3,5,4,4)
INSERT INTO pvt VALUES (2,4,1,5,5,5)
INSERT INTO pvt VALUES (3,4,3,5,4,4)
INSERT INTO pvt VALUES (4,4,2,5,5,4)
INSERT INTO pvt VALUES (5,5,1,5,5,5)
GO
--行列合并使用 UNPIVOT
SELECT VendorID, Employee, Orders into #test
FROM
(SELECT VendorID, Emp1, Emp2, Emp3, Emp4, Emp5
FROM pvt) p
UNPIVOT
(Orders FOR Employee IN --//Orders是用来作第1列的,Employee 是合并后的列名
(Emp1, Emp2, Emp3, Emp4, Emp5)
)AS unpvt
GO
select * from #test
--行列转换 使用PIVOT
select VendorID,Emp1,emp2,emp3,emp4 from #test
pivot
(count(orders) For Employee in --//可以使用相应的聚合函数
([Emp1],[emp2],[emp3],[emp4])
) as p
请注意,UNPIVOT 并不完全是 PIVOT 的逆操作。PIVOT 会执行一次聚合,从而将多个可能的行合并为输出中的单个行。而 UNPIVOT 不会重现原始表值表达式的结果,因为行已经被合并了。另外,UNPIVOT 的输入中的 NULL 不会显示在输出中,然而在执行 PIVOT 操作之前输入中可能会含有原始的 NULL 值。
参照http://blog.csdn.net/talantlee/articles/353798.aspx
针对sql2005 系统提供两个新的关键字 PIVOT 和UNPIVOT可用来作此类操作.
语法规则
<pivot_clause> ::=
( aggregate_function ( value_column )
FOR pivot_column
IN ( <column_list> )
)
<unpivot_clause> ::=
( value_column FOR pivot_column IN ( <column_list> ) )
table_source PIVOT <pivot_clause>
指定基于 table_source 对 pivot_column 进行透视。table_source 是表或表表达式。输出是包含 table_source 中 pivot_column 和 value_column 列之外的所有列的表。table_source 中 pivot_column 和 value_column 列之外的列被称为透视运算符的组合列。
PIVOT 对输入表执行组合列的分组操作,并为每个组返回一行。此外,input_table 的 pivot_column 中显示的 column_list 中指定的每个值,输出中都对应一列。
有关详细信息,请参阅“备注”部分和使用 PIVOT 和 UNPIVOT。
aggregate_function
系统或用户定义的聚合函数。聚合函数应该对空值固定不变。对空值固定不变的聚合函数在求聚合值时不考虑组中的空值。
不允许使用 COUNT(*) 系统聚合函数。
value_column
PIVOT 运算符的值列。与 UNPIVOT 一起使用时,value_column 不能是输入 table_source 中的现有列的名称。
FOR pivot_column
PIVOT 运算符的透视列。pivot_column 必须属于可隐式或显式转换为 nvarchar() 的类型。此列不能为 image 或 rowversion。
使用 UNPIVOT 时,pivot_column 是从 table_source 中提取的输出列的名称。table_source 中不能有该名称的现有列。
IN ( column_list )
在 PIVOT 子句中,列出 pivot_column 中将成为输出表的列名的值。该列表不能指定被透视的输入 table_source 中已存在的任何列名。
在 UNPIVOT 子句中,列出 table_source 中将被提取到单个 pivot_column 中的列。
建立测试环境
CREATE TABLE pvt (VendorID int, Emp1 int, Emp2 int,
Emp3 int, Emp4 int, Emp5 int)
GO
INSERT INTO pvt VALUES (1,4,3,5,4,4)
INSERT INTO pvt VALUES (2,4,1,5,5,5)
INSERT INTO pvt VALUES (3,4,3,5,4,4)
INSERT INTO pvt VALUES (4,4,2,5,5,4)
INSERT INTO pvt VALUES (5,5,1,5,5,5)
GO
--行列合并使用 UNPIVOT
SELECT VendorID, Employee, Orders into #test
FROM
(SELECT VendorID, Emp1, Emp2, Emp3, Emp4, Emp5
FROM pvt) p
UNPIVOT
(Orders FOR Employee IN --//Orders是用来作第1列的,Employee 是合并后的列名
(Emp1, Emp2, Emp3, Emp4, Emp5)
)AS unpvt
GO
select * from #test
--行列转换 使用PIVOT
select VendorID,Emp1,emp2,emp3,emp4 from #test
pivot
(count(orders) For Employee in --//可以使用相应的聚合函数
([Emp1],[emp2],[emp3],[emp4])
) as p
请注意,UNPIVOT 并不完全是 PIVOT 的逆操作。PIVOT 会执行一次聚合,从而将多个可能的行合并为输出中的单个行。而 UNPIVOT 不会重现原始表值表达式的结果,因为行已经被合并了。另外,UNPIVOT 的输入中的 NULL 不会显示在输出中,然而在执行 PIVOT 操作之前输入中可能会含有原始的 NULL 值。