Pivot_table

**樞紐表**（英語：pivot table）也翻譯成**透視表**，是用來匯總其它表的數據。首先把源表分組（grouping），然後對各組內數據做匯總操作如排序、平均、累加、計數或字符串連接等。透視表用於數據處理，在數據可視化程序如電子表格或商業智能軟體中常見。這種「樞紐」或者 pivoting 匯總表的概念得以命名。

一個平凡的例子：第一張表包含一列數，透視表僅含一行一列為源表該列的均值。稍微複雜點的例子，源表有兩列分別為_性別_與「身高」，每行給出一個人的性別與高度；透視表有兩行兩列，在「性別」列分別寫「男性」與「女性」，在「身高」列分別寫對應性別的平均身高。更為複雜與更為典型的例子，源表有列「月份」、「銷售員」、「產品」、「銷售額」，每行給出一個銷售員在某個月度賣出的某種產品的金額；透視表第一列是「銷售員」用於寫其名字，其餘列還有「產品名」與「總銷售」用於匯總該產品在該銷售人賣出的銷售總額。

透視表與列聯表 (也稱作「交叉列表」cross tabulation 或「交叉表」crosstab) 相關。但透視表被認為更為動態，可以在其上執行某些動作；而列聯表是靜態顯示數據。

微軟在美國註冊了複合詞形式的 _PivotTable_ 為商標。

## 歷史

《Pivot Table Data Crunching》指出 Pito Salas 是「透視表之父」，在開發 Lotus Improv 時，Salas 稱電子表格有數據模式，幫助用戶識別出數據模式的工具有助於快速建立高級數據模型。Lotus Improv 允許用戶定義範疇（categories）存儲集合，用滑鼠拖拉範疇名字可以改變視圖（view）。這種核心功能提供了透視表模型。Lotus Development1991 年在 NeXT 平台上發布了 Lotus Improv。幾個月後，Brio Technology 發布了在 Macintosh 的實現，稱作 DataPivot。1999 年申請了專利。 1992 年 Borland 收購了 DataPivot 技術，用在了其電子表格軟體 Quattro Pro。

1993 年 Microsoft Windows 版本的 Improv 發布。

1994 年初 Microsoft Excel 5 帶來了新功能 "PivotTable"。微軟在其後版本的 Excel 中繼續改進這個功能:

* Excel 97 包括了新的改進版的 PivotTable 嚮導（Wizard），能夠創建計算欄位，允許開發者寫 Visual Basic for Applications 小程序以創建或修改透視表；
* Excel 2000 引入了 "透視圖" 以便可視化透視表

2007 年，Oracle 公司在 Oracle 資料庫 11g 版本中推出了 `PIVOT` 與 `UNPIVOT` 運算。

## 機制

典型的數據存儲為扁平的（flat）表，即只包含行和列。 例如下述類型的電子表格：

當表中包含很多列，就難以總結出表中的信息。透視表可以快速總結數據並高亮期望的信息。「我正在看什麼？」例如，對上例，問「多少件貨在各個地區各個發貨日期被銷售？」

透視表通常包含行、列與數據（_fact_）。在這個例子中，列是「發貨日期」，行是「地區」，數據是銷售數量的匯總。

## 實現

從 SQL 編程實現角度，透視表是做一個 grouping by 操作，對組內數據做匯總計算。

下例在 Excel 中創建透視表的過程如下：

各個列可用於透視表設計的布局的四個地方：

1. 報表篩選 Report filter
2. 列標籤 Column labels
3. 行標籤 Row labels
4. 數值 Summation values

### 報表篩選 Report filter

報表篩選用於過濾源表的行。例如，滑鼠拖拉 "Color of Item" 到這個區域，則有一個下拉列表選項（Black, Red, White），可以選擇某個值作為源表中行的過濾標準，例如 "Color of Item = Black"。

### 列標籤 Column labels

列標籤用於一個或多個源表中列，其值將作為透視表中的列名。例如，滑鼠拖拉 "Sales person" 到這個區域中，那麼透視表中將有 5 個列，每個銷售人占一列，還有一列為 Grand Total。也可以施加篩選器，選中或者反選特定的銷售人。

### 行標籤 Row labels

行標籤類似於列標籤，用於一個或多個源表中列，其值將作為透視表中的行名。例如，滑鼠拖拉 "Sales person" 到這個區域中，那麼透視表中將有 5 個行，每個銷售人占一行，還有一行為 Grand Total。也可以施加篩選器，選中或者反選特定的銷售人。

### 數值 Summation values

通常選擇一個數值型的列。可施加不同的累積計算。對文本型的列，可以做計數（count）或者連接操作。上例中，如果列標籤選擇了 "Sales person", 數值選擇了 "units sold"，那麼透視表將增加一個新列 "Sum of units sold"，是對每位銷售人的銷售額匯總。

## 應用程式支持

Pivot tables or pivot functionality are an integral part of many spreadsheet applications and some database software, as well as being found in other data visualization tools and business intelligence packages. 

**電子表格**

* Microsoft Excel、Apache OpenOffice Calc、LibreOffice
* Google Docs

**資料庫**

* PostgreSQL 使用 _tablefunc_ 模塊
* MariaDB 使用 CONNECT 存儲引擎
* Microsoft Access 使用 `TRANSFORM aggfunction selectstatement PIVOT pivotfield [IN (value1[, value2[, …]])]`，aggfunction 是對被選中數據的累積計算，selectstatement 是 select 語句，pivotfield 是將在透視表中展開為列表的域， value1, value2 是創建列名的固定值。
* Oracle database 支持 PIVOT 操作
* Microsoft SQL server 從 2005 版本開始支持。透視的語法格式為：`SELECT <非旋转列>,[第一个旋转列] AS <列名>,...,[最后一个旋转列] AS <列名> FROM (<SELECT生成的数据查询>) AS <为源查询结果指定的别名>PIVOT({聚合函数运算}FOR[<被转换为列标题值的列>] IN ([第一个旋转后的列],...,[最后一个旋转后的列])AS <为透视表指定的别名><可选的Order子句>`。反透視的語法格式為：`SELECT <非旋转列>,[第一个旋转列] AS <列名>,...,[最后一个旋转列] AS <列名> FROM (透视表) AS <透视表的别名>UNPIVOT( <值的列名> FOR <列标题的列名> IN (列标题1,...,列标题N) )AS <为反透视表指定的别名>` 。
* MySQL 不支持支持透視與反透視

**Web 應用**

* ZK 框架，允許嵌入透視表

**程式語言與庫**

* Python 數據分析工具庫 pandas 的函數 _pivot\_table_, and the _xs_ method useful to obtain sections

of pivot tables.

 

## 參見

* 列聯表
* 萃取、轉置、加載
* 摺疊 (高階函數)
* 關係代數 \_(資料庫)

## 參考文獻

## 進一步閱讀

* _A Complete Guide to PivotTables: A Visual Approach_ (ISBN 1-59059-432-0) (in-depth review at slashdot.org Archive.is 的存檔，存檔日期 2013-01-13)
* _Excel 2007 PivotTables and PivotCharts: Visual blueprint_ (ISBN 978-0-470-13231-9)
* _Pivot Table Data Crunching_ (Business Solutions) (ISBN 0-7897-3435-4)
* _Beginning Pivot Tables in Excel 2007_ (ISBN 1-59059-890-3)