2016-11-22 4 views
1

2つのグループ化値を使用して、行が属するグループに基づいて行の値を列に連結する必要があります。SQLコンポジット・グループによる行の連結

TBL1

cat1 cat2 cat3 value 
    ---- ---- ---- ----- 
    1 1 lvl1 100 
    1 2 lvl2 abc 
    1 3 lvl2 cba 
    2 1 lvl1 200 
    2 2 lvl2 abb 
    3 1 lvl1 100 
    3 2 lvl2 bbc 
    3 3 lvl2 acc 
    3 4 lvl1 400 
    3 5 lvl2 acc 
    4 1 lvl1 300 
    4 2 lvl2 aab 
    ... 

TBL2

cat1 cat2 value 
    ---- ---- --------- 
    1 100 abc, cba 
    2 200 abb 
    3 100 bbc, aac 
    3 400 aac 
    4 300 aab 
    ... 

これは、静的DB2のSQLを使用しています。実際のテーブルには数千ものレコードがあります。

+0

DB2のバージョンとプラットフォームは何ですか? – mustaccio

+0

DBMS_Ver - 11.01.0005 – Jorge

答えて

2

少なくともDB2の一部のバージョンでは、listagg()がサポートされています。だから、難しい部分はグループを特定することです。これは、値が累積的に数値である行の数を数えることによって実行できます。結果の照会は次のようなものです。

select cat1, 
     max(case when value >= '0' and value <= '999' then value end) as cat2, 
     listagg(case when not value >= '0' and value <= '999' then value end, ', ') within group (order by cat2) as value 
from (select t.*, 
      sum(case when value >= '0' and value <= '999' then 1 else 0 end) over (order by cat1, cat2) as grp 
     from t 
    ) t 
group by cat1, grp; 

DB2で数値をチェックするのは難しい場合があります。上記は、サンプルデータに十分なロジック間で単純なものを使用しています。

+0

私は彼が何を求めているのか理解していません。 – Hogan

+0

@Hogan。 。 。このサイトから学ぶ最も重要な2つの事のうちの1つは、少なくともこの非常に限定された技術分野で他の人が何を求めているかを理解する方法です。 –

関連する問題