摘要:[SQL] 使用 PIVOT 旋轉資料表(橫轉直)
前言
在製作報表的時候,有時候會碰到資料是依照時間區間去紀錄的一筆一筆資料,但是使用者在看報表的時候想要將時間區間以橫向顯示而不是直向的情況出現,碰到了這種問題該如何處理呢?
在 MS SQL 2005 以上版本其實有提供一個可以快速旋轉資料表的方法,就是使用 PIVOT 語法,來看一下實際使用的方法,請參考以下範例。
範例
以下是一個紀錄報名資訊的資料表:
在資料表畫面中使用了年月區分了該時段的報名數,看得出來資料是直向往下顯示的,現在使用者提出了需求,想要將月份跟報名數以橫向的方式顯示才方便閱讀,如下:
碰到這問題與其自己想半天還不如讓專業的來,PIVOT 到了出場的時候了,看一下註解語法:
SELECT <non-pivoted column>,
[first pivoted column] AS <column name>,
[second pivoted column] AS <column name>,
...
[last pivoted column] AS <column name>
FROM
(<SELECT query that produces the data>)
AS <alias for the source query>
PIVOT
(
<aggregation function>(<column being aggregated>)
FOR
[<column that contains the values that will become column headers>]
IN ( [first pivoted column], [second pivoted column],
... [last pivoted column])
) AS <alias for the pivot table>
<optional ORDER BY clause>;
從上方註解語法來看,第一部分 SELECT .... FROM 之間:
<non-pivoted column> : 不需要旋轉的欄位。
[first pivoted column] AS <column name> : 第一個要旋轉的欄位 first pivoted column 的名稱將會對應於之後第三部分的 FOR column IN 裡面的的名稱。
第二部分 FROM ..... PIVOT 之間:
(<SELECT query that produces the data>) AS <alias for the source query> : 這裡也就是你的資料來源的地方,要注意的是尾巴AS命名的名稱不可以漏掉一定要命名。
第三部分 PIVOT 跟 FOR:
<aggregation function>(<column being aggregated>) : 這裡是需要統計的欄位,例如我們的報名數。
[<column that contains the values that will become column headers>] : 將旋轉的欄位。
IN ( [first pivoted column], [second pivoted column], ... [last pivoted column]) : 這部分前面有提到,這邊的欄位名稱將對應第一部分的名稱。
依照上面的格式編寫語法後,完成語法如下:
SELECT
Year As '年份',
[01] As '一月', [02] As '二月', [03] As '三月',
[04] As '四月', [05] As '五月', [06] As '六月',
[07] As '七月', [08] As '八月', [09] As '九月',
[10] As '十月', [11] As '十一月', [12] As '十二月'
FROM (
SELECT Year, Month, SingupNumber FROM dbo.SingUpInfo
) As STable
PIVOT (
SUM(SingupNumber) FOR
Month IN ([01], [02], [03], [04], [05], [06], [07], [08], [09], [10], [11], [12])
) As PTable
執行執行後的畫面如下:
參考資料
以上文章敘述如有錯誤及觀念不正確,請不吝嗇指教
如有侵權內容也請您與我反應~謝謝您 :)