質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

3回答

9484閲覧

【SQL】重複排除しながら縦横変換を行うSQLクエリ

asakura

総合スコア29

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2018/12/03 12:52

以下のような重複するレコードを重複排除しながら、行ごとのカラムを結合しカンマ区切りで出力したいのですが、どのように記述したら良いかわからず、お教えいただけないでしょうか。

1.対象テーブル

idval
111aaa
222aaa
222bbb
222ccc
333ccc

※valの値は可変です

2.出力したい形式

idval
111aaa
222aaa,bbb,ccc
333ccc

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

Oracle LISTADD
MySQL GROUP_CONCAT
PostgreSQL ARRAY_TO_STRING
で調べては?

同じSQLでもデータベースによって方言が大きいですから、どのデータベースを使うのかを質問のタグで明示したり、バージョンも明記した方が適切なコメントが付き易いです。 SQLの観点から Oracle Database, PostgreSQL, MySQL の特徴を整理しよう!

投稿2018/12/03 13:11

編集2018/12/03 13:12
Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

MySQL環境しか手元にありませんが、MySQLですとGROUP_CONCATが使えます

SQL

1SELECT id,val GROUP_CONCAT(val) 2FROM 対象テーブル

valの重複分も弾きたい場合は
GROUP_CONCATの中でDISTINCTを使います。

投稿2018/12/03 13:09

mepon

総合スコア480

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

asakura

2018/12/03 13:12

申し訳ございません、 環境の記述がありませんでした。 DBはPostgreSQL10になります。
asakura

2018/12/03 13:16

GROUP_CONCATをarray_to_stringで表現し、意図通り出力が行えました。 ありがとうございました。 SELECT id, array_to_string(ARRAY(SELECT unnest(array_agg(val))), ',') FROM テーブル名 GROUP BY id ORDER BY id
sazi

2018/12/03 14:56 編集

なんか冗長になってますけど、 SELECT id, array_to_string(array_agg(distinct val), ',') FROM テーブル名 GROUP BY id ORDER BY id では。
guest

0

valが固定であれば、以下のようなSQLとなりますが、
もっと良い記述がありましたら、お教えいただけないでしょうか。

sql

1select 2 id, 3 (max(case tmp.seq when 1 then tmp.val else null end), 4 max(case tmp.seq when 2 then tmp.val else null end) )as val 5from 6( 7 select 8 id 9 ,val 10 ,row_number() over (partition by id) as seq 11 from 12 テーブル名 13) tmp 14group by 15 id

array_to_stringを使った方法で、以下で意図通り出力が行えました。

sql

1SELECT 2 id, 3 array_to_string(ARRAY(SELECT unnest(array_agg(val))), ',') 4FROM テーブル名 GROUP BY id ORDER BY id

投稿2018/12/03 13:08

編集2018/12/03 13:18
asakura

総合スコア29

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sazi

2018/12/03 14:56 編集

なんか冗長になってますけど、 SELECT id, array_to_string(array_agg(distinct val), ',') FROM テーブル名 GROUP BY id ORDER BY id では。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問