SQL Server
 Computer >> コンピューター >  >> プログラミング >> SQL Server

SQL ServerのPIVOT句とは?クロス集計で行を列に変換する方法を実例付きで解説

SQL Server(Transact-SQL)では、PIVOT句を使用することで、クロス集計(ピボットテーブル)を作成できます。PIVOT句は、テーブル内の行データを列に変換し、集計結果を見やすい形式で表示するための強力な機能です。

下図は、合計値を計算し、行データを列に変換して表示する例です。

PIVOT句の基本構文

SELECT cot_dautien AS bidanh_cot_dautien,
       [giatri_chuyen1], [giatri_chuyen2], … [giatri_chuyen_n]
FROM
(
    SELECT bang_nguon.cot1, bang_nguon.cot2
    FROM bang_nguon
) AS bidanh_bang_nguon
PIVOT
(
    ham_tong(cot_tong)
    FOR cot_chuyen IN ([giatri_chuyen1], [giatri_chuyen2], … [giatri_chuyen_n])
) AS bidanh_bang_chuyen;

各パラメータの意味

パラメータ説明
cot_dautien変換後の新しいテーブルにおける最初の列となる列または式。
bidanh_cot_dautien変換後の最初の列に付ける別名(エイリアス)。
giatri_chuyen1 ~ giatri_chuyen_n列として変換したい値のリスト。
bang_nguon元データ(ソースデータ)を取得するSELECT文。
bidanh_bang_nguonbang_nguon(元テーブル)に付ける別名。
ham_tongSUM、COUNT、MIN、MAX、AVGなどの集計関数。
cot_tongham_tong(集計関数)と組み合わせて使用する列または式。
cot_chuyen変換対象の値が格納されている列。
bidanh_bang_chuyen変換後のテーブルに付ける別名。

PIVOT句は、SQL Server 2005以降のバージョン(SQL Server 2005 / 2008 / 2008 R2 / 2012 / 2014など)で利用可能です。この記事の手順を実際に試す場合は、記事末尾のDDL・DMLセクションを参考に、自分のデータベースでテーブルとデータを作成してから実行してみてください。

PIVOT句の使用例

まず、次のような社員データ(nhanvienテーブル)があるとします。

so_nhanvienho_tenluongid_phong
12009Nguyen Huong5400045
34974Pham Hoa8000045
34987Phan Lan4200045
45001Tran Hue5750030
75623Vu Hong6500030

以下のSQLコマンドを実行すると、PIVOT句を使ったクロス集計クエリが作成されます。

SELECT 'TongLuong' AS TongLuongTheoPhong,
       [30], [45]
FROM
(
    SELECT id_phong, luong
    FROM nhanvien
) AS BangNguon
PIVOT
(
    SUM(luong)
    FOR id_phong IN ([30], [45])
) AS BangChuyen;

実行結果は次のようになります。

TongLuongTheoPhong3045
TongLuong122500176000

この例では、部署IDが30の部署と45の部署それぞれの給与合計を示すテーブルが作成されます。結果は1行2列となり、各列が1つの部署に対応しています。

クロス集計クエリの組み立て手順

1. 新しいテーブルの列を指定する

まず、変換後のテーブルにどの情報を含めたいかを決めます。この例では、最初の列が「TongLuong」、続いて部署ID「30」と「45」の2列です。

SELECT 'TongLuong' AS TongLuongTheoPhong,
       [30], [45]

2. 元テーブルのデータを定義する

次に、新しいテーブルのソースデータを返すSELECT文を記述します。この例では、nhanvienテーブルからid_phongとluongを取得します。

(SELECT id_phong, luong
 FROM nhanvien) AS BangNguon

元となるクエリには必ず別名を指定する必要があります。ここでは「BangNguon」としています。

3. 集計関数を決める

クロス集計クエリで使用できる集計関数は、SUM、COUNT、MIN、MAX、AVGです。この例では給与の合計を求めるため、SUM関数を使用します。

PIVOT
(SUM(luong)

4. 変換する値を決める

最後に、結果に含めたい変換対象の値を指定します。これらはクロス集計クエリの列見出しになります。

この例では、部署IDの30と45のみを返します。これらの値が新しいテーブルの列名となります。なお、IN句で指定する値はid_phongの値の一部(限定されたリスト)であり、すべての値を含める必要はない点に注意してください。

FOR id_phong IN ([30], [45])

サンプル用のDDL / DML

上記のPIVOT句の解説にある例を自分のデータベースで試したい場合は、以下のDDL/DMLが必要です。

DDL(データ定義言語)

DDLは、PIVOT句の例で使用するテーブルを作成するCREATE TABLE文です。

CREATE TABLE phong
( id_phong INT NOT NULL,
  ten_phong VARCHAR(50) NOT NULL,
  CONSTRAINT pk_phong PRIMARY KEY (id_phong)
);
CREATE TABLE nhanvien
( so_nhanvien INT NOT NULL,
  ho VARCHAR(50) NOT NULL,
  ten VARCHAR(50) NOT NULL,
  luong INT,
  id_phong INT,
  CONSTRAINT pk_nhanvien PRIMARY KEY (so_nhanvien)
);

DML(データ操作言語)

DMLは、テーブルに必要なデータを挿入するINSERT文です。

INSERT INTO phong
(id_phong, ten_phong)
VALUES
(30, 'Ketoan');
INSERT INTO phong
(id_phong, ten_phong)
VALUES
(45, 'Banhang');
INSERT INTO nhanvien
(so_nhanvien, ho, ten, luong, id_phong)
VALUES
(12009, 'Nguyen', 'Huong', 54000, 45);
INSERT INTO nhanvien
(so_nhanvien, ho, ten, luong, id_phong)
VALUES
(34974, 'Pham', 'Hoa', 80000, 45);
INSERT INTO nhanvien
(so_nhanvien, ho, ten, luong, id_phong)
VALUES
(34987, 'Phan', 'Lan', 42000, 45);
INSERT INTO nhanvien
(so_nhanvien, ho, ten, luong, id_phong)
VALUES
(45001, 'Tran', 'Hue', 57500, 30);
INSERT INTO nhanvien
(so_nhanvien, ho, ten, luong, id_phong)
VALUES
(75623, 'Vu', 'Hong', 65000, 30);

これで準備完了です。DDLとDMLを実行してテーブルとデータを作成したら、PIVOT句を使ったクロス集計クエリを実際に動かして、行データが列に変換される様子を確認してみてください。

  1. SQL ServerのWHERE句とは?基本構文からAND・OR条件、テーブル結合まで徹底解説

    SQL Server(T-SQL)におけるWHERE句は、SELECT文やINSERT文、UPDATE文、DELETE文などの結果セットから、特定の条件に一致するレコードだけを抽出(フィルタリング)するために使用されます。データベース操作において最も頻繁に使われる句の一つであり、その使い方を正しく理解することは、効率的なクエリ作成の第一歩となります。 WHERE句の基本構文 WHERE 条件式; 条件式には、レコードが選択されるために満たすべき条件を記述します。条件がTRUEと評価された行のみが結果として返されます。 例1:単一の条件で絞り込む SELECT * FROM nhanvien W

  2. SQL ServerのFROM句とは?基本構文からJOINの使い方まで徹底解説

    SQL ServerにおけるFROM句(T-SQL)は、SQLクエリ内で必要なテーブルを指定・列挙するために使用される重要な句です。データを取得する対象となるテーブルを明示することで、SELECT文がどのテーブルから情報を読み込むべきかを定義します。 FROM句の基本構文 FROM bang1[ { INNER JOIN| LEFT OUTER JOIN| RIGHT OUTER JOIN| FULL OUTER JOIN } bang2ON bang1.cot1 = bang2.cot1 ] パラメータと引数の説明 bang1 および bang2 — SQLステートメント内で使用され