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_nguon | bang_nguon(元テーブル)に付ける別名。 |
| ham_tong | SUM、COUNT、MIN、MAX、AVGなどの集計関数。 |
| cot_tong | ham_tong(集計関数)と組み合わせて使用する列または式。 |
| cot_chuyen | 変換対象の値が格納されている列。 |
| bidanh_bang_chuyen | 変換後のテーブルに付ける別名。 |
PIVOT句は、SQL Server 2005以降のバージョン(SQL Server 2005 / 2008 / 2008 R2 / 2012 / 2014など)で利用可能です。この記事の手順を実際に試す場合は、記事末尾のDDL・DMLセクションを参考に、自分のデータベースでテーブルとデータを作成してから実行してみてください。
PIVOT句の使用例
まず、次のような社員データ(nhanvienテーブル)があるとします。
| so_nhanvien | ho_ten | luong | id_phong |
|---|---|---|---|
| 12009 | Nguyen Huong | 54000 | 45 |
| 34974 | Pham Hoa | 80000 | 45 |
| 34987 | Phan Lan | 42000 | 45 |
| 45001 | Tran Hue | 57500 | 30 |
| 75623 | Vu Hong | 65000 | 30 |
以下の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;
実行結果は次のようになります。
| TongLuongTheoPhong | 30 | 45 |
|---|---|---|
| TongLuong | 122500 | 176000 |
この例では、部署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句を使ったクロス集計クエリを実際に動かして、行データが列に変換される様子を確認してみてください。
-
SQL ServerのWHERE句とは?基本構文からAND・OR条件、テーブル結合まで徹底解説
SQL Server(T-SQL)におけるWHERE句は、SELECT文やINSERT文、UPDATE文、DELETE文などの結果セットから、特定の条件に一致するレコードだけを抽出(フィルタリング)するために使用されます。データベース操作において最も頻繁に使われる句の一つであり、その使い方を正しく理解することは、効率的なクエリ作成の第一歩となります。 WHERE句の基本構文 WHERE 条件式; 条件式には、レコードが選択されるために満たすべき条件を記述します。条件がTRUEと評価された行のみが結果として返されます。 例1:単一の条件で絞り込む SELECT * FROM nhanvien W
-
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ステートメント内で使用され