SQLを使ってデータを扱うとき、表の形を「横持ち」や「縦持ち」に変換したい場面は多々あります。
例えば、月ごとの売上を列ごとに並べたい、あるいはアンケート結果を1列にまとめたいなど。
こうした「表の回転」に便利なのが PIVOT と UNPIVOT です。
本記事では、それぞれの使い方と、主要なDBMSごとの違いを整理します。
PIVOTとは?
PIVOTは 縦持ちデータを横持ちに変換する 機能です。
例:月ごとの売上を集計して列化する。
サンプルデータ
商品 月 売上
A 1月 100
A 2月 150
B 1月 200
B 2月 180
PIVOTのイメージ
UNPIVOTとは?
UNPIVOTは 横持ちデータを縦持ちに変換する 機能です。
例:上記の「商品×月売上表」を再び「商品・月・売上」の縦持ちに戻す。
各DBMSでの書き方比較
1. SQL Server
SQL Serverはネイティブで PIVOT
/ UNPIVOT
をサポート。
2. Oracle
Oracleは PIVOT
/ UNPIVOT
が標準で利用可能。
3. PostgreSQL
PostgreSQLはPIVOT句を持たないため、crosstab関数(tablefunc拡張) を使う。
4. MySQL
MySQLには PIVOT
句はなく、CASE式 + GROUP BY を使う。
DBMS比較表
DBMS PIVOT対応 UNPIVOT対応 代替手段
SQL Server ネイティブ ネイティブ そのまま使用可
Oracle ネイティブ ネイティブ そのまま使用可
PostgreSQL なし なし crosstab関数 / UNION ALL
MySQL なし なし CASE式 + GROUP BY / UNION ALL
まとめ
-
SQL Server / Oracle → PIVOT/UNPIVOTがシンプルに使える。
-
PostgreSQL / MySQL → 標準ではなく、関数やCASE式で工夫が必要。
「集計を横に展開したい」あるいは「フラットに戻したい」とき、
DBMSに応じた方法を覚えておくと、データ整形がぐっと楽になります。