如果我想知道每位學生的每科成績,而且每個學生的全部成績排成一行,這樣方便我查看、統計,導出數據
查詢結果如圖所示,這樣我們就能很清楚的了解每位學生所有的成績了
接下來我們來看看第二個小列子。有一個遊戲玩家充值表(僅僅為了說明,舉的一個小例子)
下面來了一個統計數據的需求,要求按日期、支付方式來統計充值金額信息。這也是一個典型的行轉列的例子。我們可以通過下面的腳本來達到目的
如圖所示,我們這樣只是得到了這樣的輸出結果:
還需進一步處理,才能得到想要的結果
其實行轉列,關鍵是要理清邏輯,而且對分組(Group by)概念比較清晰。上面兩個列子基本上就是行轉列的類型了。但是有個問題來了,上面是我為了說明弄的一個簡單列子。實際中,可能支付方式特別多,而且邏輯也複雜很多,可能涉及匯率、手續費等等,如果支付方式特別多,我們的CASE WHEN 會弄出一大堆,確實比較惱火,而且新增一種支付方式,我們還得修改腳本如果把上面的腳本用動態SQL改寫一下,我們就能輕鬆解決這個問題
下面是通過PIVOT來進行行轉列的用法,大家可以對比一下,確實要簡單、更具可讀性
有時可能會出現這樣的錯誤:
消息 325,級別 15,狀態 1,第 9 行
『PIVOT』 附近有語法錯誤。您可能需要將當前資料庫的兼容級別設置為更高的值,以啟用此功能。有關存儲過程 sp_dbcmptlevel 的信息,請參見幫助。
這個是因為:對升級到 SQL Server 2005 或更高版本的資料庫使用 PIVOT 和 UNPIVOT 時,必須將資料庫的兼容級別設置為 90 或更高。有關如何設置資料庫兼容級別的信息,請參閱 sp_dbcmptlevel (Transact-SQL)。例如,只需在執行上面腳本前加上 EXEC sp_dbcmptlevel Test, 90; 就OK了, Test 是所在資料庫的名稱。
下面我們來看看列轉行,主要是通過UNION ALL ,MAX來實現。假如有下面這麼一個表
我們可以通過下面的腳本來實現,查詢結果如下圖所示
用UNPIVOT 實現如下:
- - - -End - - - -
文章來源|www.cnblogs.com/kerrycode/archive/2010/07/28/1786547.html 作者:瀟湘隱者
尊重原創,感謝原創,如有侵權,本文立刪。