Microsoft SQL ServerでPIVOTを使ったサンプル

本資料は Microsoft SQL Server で PIVOT を使った記事となります。
例えば、集計しGROUP BY した結果を横にしたい…縦にしたい…など集計結果の表を縦横に変えたい場合にPIVOTが便利かもしれません。
CASE WHENを使えば、縦横表示は可能ですが…

動作確認環境

SELECT @@VERSION
Microsoft SQL Server 2019 (RTM-GDR) (KB5021125) - 15.0.2101.7 (X64)   Jan 23 2023 13:08:05   Copyright (C) 2019 Microsoft Corporation  Developer Edition (64-bit) on Windows 10 Pro 10.0 <X64> (Build 19045: ) 

PIVOTを試す前に

以下に記すテーブルとレコードをINSERTし、販売者(person)と商品(product)でPIVOTしてみます。
また、意図しない動作になる例も記します。

テストテーブルおよびテストデータ

本記事の動作を試すには以下のテーブル作成とテストデータをINSERTしてください。

GROUP BY した場合

本記事では GROUP BY し数量(quantity)の合計値(SUM)を販売者(person)と商品(product)をPIVOTを使って、カラムとして表示します。
以下のようにGROUP BY を使用すると以下のようになります。

PIVOTを試す

personとproductでPIVOTしてみます。

販売者(person)でPIVOT

販売者(person)でPIVOTした時のサンプルSQLと結果となります。

SQL

SELECT
   pvt.product
  ,pvt.高橋
  ,pvt.佐藤
  ,pvt.鈴木
FROM
(
  SELECT
    person, product, quantity
  FROM
    sales
) T
PIVOT
(
   SUM(quantity)
   FOR person IN (高橋,佐藤,鈴木)
) AS pvt

結果

product高橋佐藤鈴木
Linux500550
macOS700770
Windows900990

販売者(person)がカラムになっているのが確認できます。

商品(product)でPIVOT

商品(product)でPIVOTした時のサンプルSQLと結果となります。

SQL

SELECT
  pvt.person
  ,pvt.Linux
  ,pvt.macOS
  ,pvt.Windows
FROM
(
  SELECT
    person, product, quantity
  FROM
    sales
) T
PIVOT
(
   SUM(quantity)
   FOR product IN (Linux,macOS,Windows)
) AS pvt

結果

personLinuxmacOSWindows
高橋500700900
佐藤579
鈴木507090

失敗例

上記では、PIVOT対象となる表を以下のSQLで取得しています。

(
  SELECT
    person, product, quantity
  FROM
    sales
) T

これは、salesテーブルにはsale_date(販売日)があり、以下のようにPIVOTすると、意図した動作になりません。


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS