0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【SQL】複数行の値を1行にまとめる方法(LISTAGG / string_agg / GROUP_CONCAT)

Posted at

はじめに

日頃から Amazon Redshift を使っていて、複数行の値を1行にまとめたいときに LISTAGG を使っていました。
ただ、他のデータベース(MySQLやPostgreSQLなど)で同じことをしようとすると、書き方が微妙に違うことに気付きました。
そこで今回は、主要な3つのデータベース(Oracle/PostgreSQL/MySQL)で「複数行の値を1行にまとめる方法」を整理します。

DBごとの関数対応表

データベース 関数名
Oracle / Redshift LISTAGG LISTAGG(name, '区切り文字')
PostgreSQL string_agg string_agg(name, '区切り文字')
MySQL GROUP_CONCAT GROUP_CONCAT(name SEPARATOR '区切り文字')

テーブルの例

itemsテーブル

id name
1 りんご
2 みかん
3 バナナ
4 ぶどう
5 もも

各DBでの書き方例

Oracle / Redshiftの場合

SELECT
  LISTAGG(name, ', ') AS names
FROM
  items;

→ 出力例

names
りんご, みかん, バナナ, ぶどう, もも

LISTAGG(列名, ', ') で複数行の値をカンマ区切りにまとめられます。

※RedshiftはPostgreSQLをベースにしていますが、string_aggは使えず、LISTAGGが利用できるようです。

PostgreSQLの場合

SELECT
  string_agg(name, ', ') AS names
FROM
  items;

string_agg(列名, ', ') で複数行の値をカンマ区切りにまとめられます。

MySQLの場合

SELECT
  GROUP_CONCAT(name SEPARATOR ', ') AS names
FROM
  items;

GROUP_CONCATSEPARATOR に区切り文字を指定します(デフォルトはカンマ,)。

補足:DISTINCTで重複を除外する

どのDBでも、DISTINCTを使うと重複を除外して連結できます。

-- PostgreSQLの例
SELECT
  string_agg(DISTINCT name, ', ') AS names
FROM
  items;

まとめ

  • LISTAGGOracle / Redshift で利用可能
  • PostgreSQL では string_agg
  • MySQL では GROUP_CONCAT
  • DISTINCT で重複を除外できる

さいごに

SQL Fiddleというサイト(以下リンク先)を使うと気軽にブラウザで各DBを試すことができて便利でした。
https://sqlfiddle.com/

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?