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 |
新聞熱點
疑難解答