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

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

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

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

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

Q&A

解決済

2回答

5331閲覧

単一のテーブルから、特定のカラムが同一のものを連結して取り出したい。

退会済みユーザー

退会済みユーザー

総合スコア0

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

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

1グッド

1クリップ

投稿2017/01/14 10:23

編集2017/01/14 12:05

Postgreのデータベースに以下のようなテーブルAがあります。

code | tag 100 | 焼肉 100 | ステーキ 100 | 炭火焼き 200 | ブランド・ショップ 200 | セレクトショップ 301 | 電化製品 301 | ビックカメラ 301 | ヨドバシカメラ ・ | ○○○○○ ・ | ○○○○○ ・ | ○○○○○ ・ | ○○○○○ 1000行くらいあります。

上記のようなテーブルがあるとします。
これを、以下のようにしてとりだしたいと考えています。

code_unique | connect_tag 100 | 焼肉、ステーキ、炭火焼き 200 | ブランド・ショップ、セレクトショップ 301 | 電化製品、ビックカメラ、ヨドバシカメラ ・ ・ ・ 続きます。

上記のような形式で、タグを[、]句読点で結合して取り出したいです。
この場合、どのようなSQLで取得できるでしょうか?

よろしくご教授くださいませ。

AketiJyuuzou👍を押しています

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

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

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

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

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

maisumakun

2017/01/14 11:18

SQLだけで実現するより、PHPなど受け取った側で加工するほうがこの場合は楽だと思いますが、それでも「SQLだけで」処理させる必要がある、ということでしょうか。
退会済みユーザー

退会済みユーザー

2017/01/14 11:26

ご回答ありがとうございます。そうですね、上記のテーブルを再度別のSQLのサブクエリに使う予定なので、PHPなどのアプリケーション側での加工ではだめなのです。。。
guest

回答2

0

PostgreSQL 9.6.1文書 9.20. 集約関数
https://www.postgresql.jp/document/9.6/html/functions-aggregate.html
のstring_agg関数を見ながら、PostgreSQL9.3で作ってみました :-)

sql

1with t(code,tag) as( 2values(100,'焼肉'), 3 (100,'ステーキ'), 4 (100,'炭火焼き'), 5 (200,'ブランド・ショップ'), 6 (200,'セレクトショップ'), 7 (301,'電化製品'), 8 (301,'ビックカメラ'), 9 (301,'ヨドバシカメラ')) 10select code,string_agg(tag,'、') 11 from t 12group by code 13order by code; 14 15| code | string_agg | 16|------|-----------------------------------------| 17| 100 | 焼肉、ステーキ、炭火焼き | 18| 200 | ブランド・ショップ、セレクトショップ | 19| 301 | 電化製品、ビックカメラ、ヨドバシカメラ |

投稿2017/01/14 11:33

AketiJyuuzou

総合スコア1147

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

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

0

ベストアンサー

配列関数を使って作成しました。

sql

1create temp table hoge_tb1 (code int, tag text); 2 3insert into hoge_tb1 values 4(100, '焼肉'), 5(100, 'ステーキ'), 6(100, '炭火焼き'), 7(200, 'ブランド・ショップ'), 8(200, 'セレクトショップ'), 9(301, '電化製品'), 10(301, 'ビックカメラ'), 11(301, 'ヨドバシカメラ') 12; 13 14select code code_unique, array_to_string(array_agg(tag),'、') connect_tag 15from hoge_tb1 group by code order by 1;

投稿2017/01/14 11:59

編集2017/01/14 12:02
A.Ichi

総合スコア4070

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

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

退会済みユーザー

退会済みユーザー

2017/01/14 12:04

ご回答ありがとうございます。 (100, '焼肉'), (100, 'ステーキ'), (100, '炭火焼き'), (200, 'ブランド・ショップ'), (200, 'セレクトショップ'), (301, '電化製品'), (301, 'ビックカメラ'), (301, 'ヨドバシカメラ') 上記の部分は直接ハードコードするんでしょうか? この連結したいカラムのレコードが1000行くらいあるので上記のような記述が無理なんです・。。。
A.Ichi

2017/01/14 12:10

テーブル hoge_tb1は例題なので、1000行のテーブル(テーブルA)をそのまま使われても良いと思いますが。
退会済みユーザー

退会済みユーザー

2017/01/14 12:11 編集

それはテーブル作るのが煩わしいから VIEW定義しているだけですよ。 From hoge_tb1 の hoge_tb1 をあなたが使っているテーブル名に変えて SELECT 以降を使えばいいのです
A.Ichi

2017/01/14 12:17

AketiJyuuzouさんの集約関数の方が良いと思います。 select code code_unique, string_agg((tag),'、') connect_tag from テーブルA group by code order by 1;
退会済みユーザー

退会済みユーザー

2017/01/14 12:32

ご回答ありがとうござます。 上記のサンプル例を実際に実行してみると、 SQL エラー: ERROR: function string_agg(text, unknown) does not exist LINE 1: ...UNT(*) AS total FROM (select shop_id shop_unique, string_agg... ^ HINT: No function matches the given name and argument types. You might need to add explicit type casts. 文: SELECT COUNT(*) AS total FROM (select shop_id shop_unique, string_agg((tanpintag_name), '、') connect_tag from d_tanpin_tag group by code order by 1) AS sub 上記の用のなSQLErrorが発生するようなのですが、どこがおかしいのでしょうか?
A.Ichi

2017/01/14 12:45

下記のどちらかでは、どうでしょうか? SELECT COUNT(*) AS total FROM (select shop_id shop_unique, string_agg(tanpintag_name, '、') connect_tag from d_tanpin_tag group by shop_id order by 1) AS sub; SELECT COUNT(*) AS total FROM (select shop_id shop_unique, array_to_string(array_agg(tanpintag_name), '、') connect_tag from d_tanpin_tag group by shop_id order by 1) AS sub;
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問