SQL

行を列に列を行にするSQL

こんにちは ともです。

今回は行を列に列を行にする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 件のコメント:

コメントを投稿

コメントをお待ちしています。