PIVOT和UNPIVOT关系运算符是SQL Server 2005提供的新增功能,因此,对升级到SQL Server 2005的数据库使用PIVOT和UNPIVOT时,数据库的兼容级别必须设置为90(可以使用sp_dbcmptlevel存储过程设置兼容级别)。
在查询的FROM子句中使用PIVOT和UNPIVOT,可以对一个输入表值表达式执行某种操作,以获得另一种形式的表。PIVOT运算符将输入表的行旋转为列,并能同时对行执行聚合运算。而UNPIVOT运算符则执行与PIVOT运算符相反的操作,它将输入表的列旋转为行。
在FROM子句中使用PIVOT和UNPIVOT关系运算符时的语法格式如下:
[ FROM { <table_source> } [ ,...n ] ] <table_source> ::= { table_or_view_name [ [ AS ] table_alias ] <pivoted_table> | <unpivoted_table> } <pivoted_table> ::=table_source PIVOT <pivot_clause> table_alias <pivot_clause> ::=( aggregate_function ( value_column ) FOR pivot_column IN ( <column_list> ) ) <unpivoted_table> ::=table_source UNPIVOT <unpivot_clause> table_alias <unpivot_clause> ::=( value_column FOR pivot_column IN ( <column_list> ) ) <column_list> ::= column_name [ , ... ] table_source PIVOT <pivot_clause> |
ProductID | OrderMonth | SubTotal |
1 | 5 | 100.00 |
1 | 6 | 100.00 |
2 | 5 | 200.00 |
2 | 6 | 200.00 |
2 | 7 | 300.00 |
3 | 5 | 400.00 |
3 | 5 | 400.00 |
SELECT ProductID, [5] AS 五月, [6] AS 六月, [7] AS 七月 FROM Sales.Orders PIVOT ( SUM (Orders.SubTotal) FOR Orders.OrderMonth IN ( [5], [6], [7] ) ) AS pvt ORDER BY ProductID; |
SELECT ProductID, OrderMonth, SUM (Orders.SubTotal) AS SumSubTotal FROM Sales.Orders GROUP BY ProductID,OrderMonth; |
ProductID | OrderMonth | SumSubTotal |
1 | 5 | 100.00 |
1 | 6 | 100.00 |
2 | 5 | 200.00 |
2 | 6 | 200.00 |
2 | 7 | 300.00 |
3 | 5 | 800.00 |
ProductID | 5 | 6 | 7 |
1 | 100.00 | 100.00 | NULL |
2 | 200.00 | 200.00 | 200.00 |
3 | 800.00 | NULL | NULL |
ProductID | 五月 | 六月 | 七月 |
1 | 100.00 | 100.00 | NULL |
2 | 200.00 | 200.00 | 200.00 |
3 | 800.00 | NULL | NULL |
CREATE TABLE MyPvt (ProductID int, 五月int, 六月 int, 七月int); --建立MyPvt表 GO --将表5-5中所示的值插入到MyPvt表中 INSERT INTO MyPvt VALUES (1,100,100,0); INSERT INTO MyPvt VALUES (2,200,200,200); INSERT INTO MyPvt VALUES (3,800,0,0); --执行UNPIVOT SELECT ProductID, OrderMonth, SubTotal FROM MyPvt UNPIVOT (SubTotal FOR OrderMonth IN (五月, 六月, 七月) )AS unpvt; |
ProductID | OrderMonth | SubTotal |
1 | 五月 | 100 |
1 | 六月 | 100 |
1 | 七月 | 0 |
2 | 五月 | 200 |
2 | 六月 | 200 |
2 | 七月 | 200 |
3 | 五月 | 800 |
3 | 六月 | 0 |
3 | 七月 | 0 |
新闻热点
疑难解答