SQL
行を列に列を行にするSQL
13:08
こんにちは ともです。
今回は行を列に列を行にするSQLとして2カラムのデータを2行にする、および、2行のデータを2カラムで取得するSQLの書き方について記載します。
携わる案件のなかには「データ移行」や、「機能拡張でテーブル構成を変更」のような場面があると思います。そんな中で調査やデータ移行などでちょっと役にたつかもしれないSQLの書き方について記載します。
行データを列にする
以下のようにユーザ名と文系と理系の点数を持っているユーザを例に説明します。
テーブル名はユーザテーブルとします。
ユーザー名 | カテゴリ | 点数 |
---|---|---|
山田太郎 | 文系 | 80 |
山田太郎 | 理系 | 60 |
山田次郎 | 文系 | 70 |
山田次郎 | 理系 | 80 |
このデータを以下のような型式で取得します。
ユーザー名 | 文系点数 | 理系点数 |
---|---|---|
山田太郎 | 80 | 60 |
山田次郎 | 70 | 80 |
SQLは以下の通りです。外部結合を使ってデータを取得します。
SELECT
文系データ.ユーザー名
, 文系データ.文系点数
, 理系データ.理系点数
FROM
(
SELECT
ユーザー名
, 点数 AS 文系点数
FROM ユーザテーブル
WHERE カテゴリ = '文系'
) 文系データ
LEFT OUTER JOIN
(
SELECT
ユーザー名
, 点数 AS 理系点数
FROM ユーザテーブル
WHERE カテゴリ = '理系'
) 理系データ
ON 文系データ.ユーザー名 = 理系データ.ユーザー名
列のデータを行にする
以下のようにユーザ名と文系と理系の点数を持っているユーザを例に説明します。
テーブル名はユーザテーブルとします。
ユーザー名 | 文系点数 | 理系点数 |
---|---|---|
山田太郎 | 80 | 60 |
山田次郎 | 70 | 80 |
このデータを以下のような型式で取得します。
ユーザー名 | カテゴリ | 点数 |
---|---|---|
山田太郎 | 文系 | 80 |
山田太郎 | 理系 | 60 |
山田次郎 | 文系 | 70 |
山田次郎 | 理系 | 80 |
上記のようなSQLを作成する場合は以下のようにUNION ALLを使って同じテーブルを利用することで作成することができます。
SELECT
結果.ユーザー名
, 結果.カテゴリ
, 結果.点数
FROM
(
SELECT
ユーザー名
, '文系' AS カテゴリ
, 文系点数 AS 点数
FROM ユーザテーブル
UNION ALL
ユーザー名
, '理系' AS カテゴリ
, 理系点数 AS 点数
FROM ユーザテーブル
) 結果
0 件のコメント:
コメントを投稿
コメントをお待ちしています。