以下のような重複するレコードを重複排除しながら、行ごとのカラムを結合しカンマ区切りで出力したいのですが、どのように記述したら良いかわからず、お教えいただけないでしょうか。
1.対象テーブル
id | val |
---|---|
111 | aaa |
222 | aaa |
222 | bbb |
222 | ccc |
333 | ccc |
※valの値は可変です
2.出力したい形式
id | val |
---|---|
111 | aaa |
222 | aaa,bbb,ccc |
333 | ccc |
よろしくお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答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総合スコア16415
0
ベストアンサー
MySQL環境しか手元にありませんが、MySQLですとGROUP_CONCATが使えます
SQL
1SELECT id,val GROUP_CONCAT(val) 2FROM 対象テーブル
valの重複分も弾きたい場合は
GROUP_CONCATの中でDISTINCTを使います。
投稿2018/12/03 13:09
総合スコア480
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/12/03 13:16
2018/12/03 14:56 編集
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総合スコア29
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。