使用pivot和unpivot語句實現行轉列,列轉行
引用MSDN:
可以使用 PIVOT 和 UNPIVOT 關係運算符將表值表示式更改為另一個表。PIVOT 通過將表示式某一列中的唯一值轉換為輸出中的多個列來旋轉表值表示式,並在必要時對最終輸出中所需的任何其餘列值執行聚合。UNPIVOT 與 PIVOT 執行相反的操作,將表值表示式的列轉換為列值,但是在實際應用中,有些聚合之後的資料很難進行拆分。所以呢,unpivot並非pivot的逆過程。
pivot 提供的語法比一系列複雜的 SELECT...CASE 語句中所指定的語法更簡單和更具可讀性。
使用SELECT...CASE語句進行行轉列的方法見:解析SQL Server中行轉列問題
簡單的例子如下:
---------行轉列
create table test(編號 int,姓名 varchar(20),季度 int,銷售額 int)
insert into test values(1,'simon',1,1000);
insert into test values(1,'simon',2,2000);
insert into test values(1,'simon',3,3000);
insert into test values(1,'simon',4,4000);
insert into test values(2,'meme',1,5000);
insert into test values(2,'meme',2,6000);
insert into test values(2,'meme',3,7000);
insert into test values(2,'meme',4,8000);
select * from test;
select 編號,姓名,[1] as "一季度",[2] as "二季度",[3] as "三季度",[4] as "四季度",[5] as "隨便1" from test pivot(sum(銷售額)
for 季度 in([1],[2],[3],[4],[5]))as pvt
--------列轉行
create table test2(編號 int,姓名 varchar(20), 一季度 int, 二季度 int, 三季度 int, 四季度 int);
insert into test2 values(1,'simon',1000,2000,4000,5000);
insert into test2 values(2,'meme',3000,3500,4200,5500);
select * from test2
select 編號,姓名,季度,銷售額from test2 unpivot(銷售額for 季度 in(一季度,二季度,三季度,四季度)) as unpvt
建議:如果你想了解的更加清楚,請參考:http://technet.microsoft.com/zh-cn/library/ms177410.aspx
注意:對升級到 SQL Server 2005 或更高版本的資料庫使用 PIVOT 和 UNPIVOT 時,必須將資料庫的相容級別設定為 90 或更高。如果第一種pivot不是很明白可以看看這個select 編號,姓名,[1],[2],[3],[4]
from
(
select * from test
) as sourceTable
pivot
(
sum(銷售額)
for 季度 in ([1],[2],[3],[4])
)as pivotTable這個是自己寫的,稍稍明白一點!