2017-02-13 5 views
1

私は3つの列を持つサービステーブルを持っています。テーブルからすべての行をカンマで区切った値

sr_id lang alias 
1  EN A 
1  PA B 
1  HI C 
2  EN D 
2  HI E 

は今、私は各サービスIDと出力したいサービスは、LANGとエイリアス列には、サービスのエイリアスの連結になります。

サンプル出力 -

SR_ID lang alias 
1  EN  A,B,C 
1  PA  A,B,C 
1  HI  A,B,C 
2  EN  D,E 
2  HI  D,E 

私は、PostgreSQL 9.4とそれを行うことができますどのように?

答えて

1

同じサンプルデータで同様の条件を作成しようとしました。あなたがそれらをソートする必要はありません場合は、使用できるクエリ

select a.sr_id , a.lang, b.ALIAS from 
SERVICES a , 
(
select sr_id , string_agg(ALIAS::text,',') ALIAS 
from SERVICES 
group by sr_id) b 
where a.sr_id = b.sr_id; 
+3

明示的な結合を使用する方が良いだろう古いファッション(1992年以前の旧式の)暗黙的な結合ではなく、 '... FROMサービスA JOIN(SELECT ...)B ON A.Sr_ID = B.Sr_ID ... 'です。 –

+0

ありがとうございます。気をつけます。 – Tajinder

3

下に確認してください:

select sr_id, lang, string_agg(alias, ',') over() as alias 
from services 
order by sr_id; 

そうでなければ、あなたが必要とする:

select s.sr_id, s.lang, t.alias 
from services s 
join (
    select sr_id, string_agg(alias, ',' order by alias) as alias 
    from services 
    group by sr_id 
) t on t.sr_id = s.sr_id 
order by s.sr_id; 
+0

可読性/性能のために内部サブクエリをCTEに入れることができますが、とにかく+1します –

+0

@TimBiegeleisen:クエリでグループをパフォーマンスに影響させることはありません –

関連する問題