oracle グループ化したデータをカンマ区切りで取得する

グループ化した際に集計する関数といえば、MAX,MIN,COUNTなどがよく使われると思います。

文字列のカラムを集計した時にMAX,MINなどで一つの値を取得するのではなく、グループ対象のすべてのデータをカンマ区切りなどでつなげて取得したい場合があるかと思います。

以下のような取得です。(わかりやすくするため、正規化は考えていません)

社員マスタ
社員コード社員名部署
1テスト社員1開発部
2テスト社員2営業部
3テスト社員3開発部
4テスト社員4営業部

部署ごとに社員をカンマ区切りで取得したい。

社員マスタ
部署社員一覧
開発部テスト社員1,テスト社員3
営業部テスト社員2,テスト社員4

LISTAGG関数

Oracle 11g R2ではMAX,MINと同じようにLISTAGGという関数が用意されています。

Oracle 11g R2以前のバージョンでの取得方法は後ほど紹介します。

以下のように使います。

SELECT
  T1.部署
  LISTAGG(T1.社員名, ',') WITHIN GROUP (ORDER BY T1.社員コード) 社員一覧
FROM
  社員マスタ T1
GROUP by
  T1.部署

LISTAGG(T1.社員名, ',')でグループ対象の社員名を,区切りで取得します。第2引数の,で区切り文字を指定します、/などで区切ることもあるかと思います。

省略時は,になります。

WITHIN GROUP (ORDER BY T1.社員コード)ORDER BY T1.社員コードで区切りで連結する順番を指定できます。

上の例では社員コードの昇順でソートするため、テスト社員1,テスト社員3とソートされます。

ORDER BY T1.社員コード DESCとした場合はテスト社員3,テスト社員1となります。

wmsys.wm_concat

Oracle 11g R2以前のバージョンでLISTAGGが使えない場合はwmsys.wm_concatという関数を使います。

ただし、この方法はマニュアルにも載っていない方法なので、サポート対象外ですのでご注意ください。

SELECT
  T1.部署
  wmsys.wm_concat(T1.社員名) 社員一覧
FROM
  社員マスタ T1
GROUP by
  T1.部署

関連記事

  • SQL WITH句でVIEWを作成し重複するSQL文をまとめる

    WITH句を使えば1つの副問い合わせ(SQL)を複数の箇所で使いまわすことができます。例としてSQL 副問い合わせの基本を理解するで扱ったFROM句の副問い合わせのSQLをおさらいします。※今回は学習...


  • SQL WHERE句でデータを絞り込む

    「社員マスタ」と「部署マスタ」というテーブルがあります。今回は、社員マスタに「年齢」カラムを追加してあります。年齢が25歳以上で営業部に所属する社員を表示したい。SQLは下記のようになります。取得する...


  • SQL UPDATE文でデータを更新する

    UPDATE文でデータベースに新しいデータを更新する方法を紹介します。「社員マスタ」というテーブルがあります。カラムは下記のとおりです。テスト社員2の年齢を31歳に更新したい場合、以下のようなSQLを...


  • SQL 副問い合わせの基本を理解する

    副問い合わせとはSQL文の中に入れ子でSQL文を指定することをいいます。例えば下記のSQL文は副問い合わせを使用しています。副問い合わせはWHERE句だけでなく、SELECT句やFROM句でも使用する...


  • SQL SELECT句の基本的な使い方

    SELECT句ではデータベースの指定したテーブルからデータを取得する際に、どの項目を取得するか指定します。下記に具体的な使い方を紹介します。「商品マスタ」というテーブルがあります。カラムは下記のとおり...


  • SQL SELECTした結果をINSERTで登録する

    SELECTとINSERTを組み合わせて効率よくデータを登録することができます。SELECT文で取得したデータをINSERT文でデータベースに新しいデータを登録する方法を紹介します。「社員マスタ」とい...


  • SQL ORACLEのROWNUMで行番号を取得する際の注意点

    Oracleで行番号を取得する際の基本的な考え方と注意点を紹介します。行番号はROWNUMで取得することができます。注意しなければならないのは、ORDER BYでソートする場合です。ORDER BYは...


  • SQL ROLLUP文で小計行・合計行を出力する (oracle, sql server)

    「社員マスタ」と「売上明細」というテーブルがあります。売上明細テーブルには、社員の売上情報が格納されています。社員ごとに、会社ごとの売上合計を表示し、社員ごとにすべての会社の小計行も出力したい、また最...


  • SQL チューニングでレスポンス改善に効果のあったポイント

    SQLのレスポンス改善に効果のあった対応内容をまとめます。環境はOracleですが、他のデータベースでも参考になると思います。パフォーマンスは同じようなSQLでもテーブルのインデックスなどの構成やデー...


  • SQLとプログラミング言語の考え方の違い

    SQLは他のJAVAやC言語などのプログラミング言語とは異なる考え方で、実装を行う必要があります。プログラミング言語は基本的には上から順番に実行されていきます。これを手続き型言語と呼ぶことが多いのです...