グループにおける 数値式、文字列式、または、バイナリ文字列式 expr の連結 結果を戻す。
言い換えると、縦並びの表示結果を横に並び替えた上、カンマ区切りなどで1つの文字列に変換することができる。 expr が数値、文字列、日付の場合には文字列に暗黙変換され文字列として戻される。 RAW 型の場合には RAW 型が戻される。
MySQL における group_concat 関数の Oracle 版である。
LISTAGG 使用例
LISTAGG 関数 サンプルデータ
name
dept
salary
すずき
管理部
300,000
たかはし
管理部
400,000
さとう
開発部
500,000
こばやし
開発部
500,000
やまもと
開発部
200,000
あおき
開発部
NULL
全員の name を並び順を気にせずに連結する。
WITHIN GROUP は省略できないので意味のない 「order by null」 を指定してみた。数値を指定してもカラムの第 N 番目でソートというわけでない。
Oracle 11g R2 時点では実行計画に SORT GROUP BY があり、暗黙的に expr 昇順にソートされている。
SQL> selectLISTAGG(name) WITHIN GROUP (order by null) concat_name
2 from listagg_sample;
CONCAT_NAME
--------------------------------------------------
あおきこばやしさとうすずきたかはしやまもと
部門毎に名前をカンマ区切りで連結する。名前の並び順は給料の高い順
SQL> select dept, LISTAGG(name, ',') WITHIN GROUP (order by saraly desc nulls last) csv_name
2 from listagg_sample
3 group by dept;
DEPT CSV_NAME
-------- -------------------------------
開発部 こばやし,さとう,やまもと,あおき
管理部 たかはし,すずき
他の集計関数同様 NULL の項目は除外されるため他の項目とのマッチングはできない。
SQL> select
2 LISTAGG(name,',') WITHIN GROUP (order by name) csv_name,
3 LISTAGG(saraly,',') WITHIN GROUP (order by name) csv_saraly
4 from listagg_sample;
CSV_NAME CSV_SARALY
-------------------------------------------------- ----------------------------------
あおき,こばやし,さとう,すずき,たかはし,やまもと 500000,500000,300000,400000,200000
SQL> select
2 LISTAGG(name,',') WITHIN GROUP (order by name) csv_name,
3 rtrim(
4 LISTAGG(saraly||',') WITHIN GROUP (order by name)
5 , ','
6 ) csv_saraly
7 from listagg_sample;
CSV_NAME CSV_SARALY
-------------------------------------------------- -----------------------------------
あおき,こばやし,さとう,すずき,たかはし,やまもと ,500000,500000,300000,400000,200000