PIVOT用於將列值旋轉為列名(即行轉列),PIVOT的一般語法是:PIVOT(聚合函數(列) FOR 列 in (…) )AS P
完整語法:
table_source
PIVOT(
聚合函數(value_column)
FOR pivot_column
IN(<column_list>)
)
UNPIVOT用於將列明轉為列值(即列轉行),可以用UNION來實現
完整語法:
table_source
UNPIVOT(
value_column
FOR pivot_column
IN(<column_list>)
)
案例:
姓名 課程 分數
---------- ---------- -----------
張三 語文 74
張三 數學 83
張三 物理 93
李四 語文 74
李四 數學 84
李四 物理 94
根據姓名統計這個人的三門成績,即:姓名 語文 數學 物理
首先看看使用case when end結構的時候:
select 姓名,
max(case 課程 when '語文' then 分數 else 0 end)語文,
max(case 課程 when '數學'then 分數 else 0 end)數學,
max(case 課程 when '物理'then 分數 else 0 end)物理
from tb
group by 姓名
--------------------------------結果------------------------------------------------------------------------------------
姓名 語文 數學 物理
---------- ----------- ----------- -----------
李四 74 84 94
張三 74 83 93
這個結果就是我們想要的,然后再看看使用pivot:
select * from tb pivot(max(分數) for 課程 in (語文,數學,物理))a
--------------------------------結果------------------------------------------------------------------------------------
姓名 語文 數學 物理
---------- ----------- ----------- -----------
李四 74 84 94
張三 74 83 93