1. 程式人生 > >PIVOT函式,行轉列

PIVOT函式,行轉列

PIVOT函式的格式如下

PIVOT(<聚合函式>([聚合列值]) FOR [行轉列前的列名] IN([行轉列後的列名1],[行轉列後的列名2],[行轉列後的列名3],.......[行轉列後的列名N]))
  • <聚合函式>就是我們使用的SUM,COUNT,AVG等Sql聚合函式,也就是行轉列後計算列的聚合方式。
  • [聚合列值]要進行聚合的列名
  • [行轉列前的列名]這個就是需要將行轉換為列的列名。
  • [行轉列後的列名]這裡需要宣告將行的值轉換為列後的列名,因為轉換後的列名其實就是轉換前行的值,所以上面格式中的[行轉列後的列名1],[行轉列後的列名2],[行轉列後的列名3],......[行轉列後的列名N]其實就是[行轉列前的列名]每一行的值。
select *
from ShoppingCart as C 
PIVOT(count(TotalPrice) FOR [Week] IN([1],[2],[3],[4],[5],[6],[7])) AS T 

我們可以看到PIVOT函式成功地將[ShoppingCart]表列[Week]的行值轉換為了七列,並且每一列統計轉換前的行數為1,這符合我們的預期結果。那麼根據我們前面定義的PIVOT函式轉換格式,在本例中我們有如下公式對應值:

  • <聚合函式>本例中為Count
  • [聚合列值]本例中為[TotalPrice],統計了行轉列前的行數
  • [行轉列前的列名]本例中為[Week]
  • [行轉列後的列名]本例中為[1],[2],[3],[4],[5],[6],[7]七個列,因為行轉列前[ShoppingCart]表的[Week]列有七個值1,2,3,4,5,6,7,所以這裡宣告轉換後的列名也為七個,對應這七個值分別為[1],[2],[3],[4],[5],[6],[7],PIVOT函式會將[ShoppingCart]表中[Week]列的值分別和[1],[2],[3],[4],[5],[6],[7]這七列的列名進行匹配,然後計算<聚合函式>(本例中為count(TotalPrice))得出轉換後的列值。

另外如果我們在[行轉列後的列名]中只聲明瞭部分值,那麼PIVOT函式只會針對這些部分值做行轉列,而那些沒有被宣告為列的行值會在行轉列後被忽略掉。例如我們下面的語句聲明瞭只對表ShoppingCart中[Week]列的1,2,3三個值做行轉列,但是實際上表ShoppingCart中列[Week]有1,2,3,4,5,6,7這7個值,那麼剩下的4到7就會被PIVOT函式忽略掉,如下所示: