在SQL Server中使用SQL實現行轉列、列轉行,可以使用多種方法,在SQL 2005以前可以使用case when then...語句,但這種方法的問題在於列舉的列名要寫死,如果列名很多,case when 語句會很長,並不優雅。所以需要SQL Server提供新的語句能夠實現。在2005版本就推出了pivot/unpivot關鍵字,可以方便的實現。這方面的資料已經很多,這裏提供一個簡單的示例,以便快速上手。
一、SQL列轉行
假設有一張表,結構和數據是這樣子的:
想轉換爲如下的形式:
這個就是典型的列轉行的形式,需要使用unpivot。
SQL實現:
select 姓名,科目, val from [dbo].[科目成績]
unpivot (val for 科目 in([語文],[數學],[英語])) as u
二、SQL行轉列
現在假設已經有了這張表:
我們借用上面的SQL得到的臨時表,將其還原爲:
這是典型的行轉列的實現,需要用到pivot。
SQL實現:
with aa as(
select 姓名,科目, val from [dbo].[科目成績]
unpivot (val for 科目 in([語文],[數學],[英語])) as u)
select * from aa pivot(max(val) for 科目 in ([語文],[數學],[英語])) as tt
order by [語文] desc,[數學] desc,[英語] desc;
得到如下表格:
按照語文、數學、英語的分數依次降序排列。