2016-11-22 99 views
1

我需要根据行所属的哪个组使用两个分组值来将行值连接到列中。通过组合组的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

@霍根。 。 。我从这个网站学到的两件最重要的事情之一是如何理解别人的要求 - 至少在这个非常有限的技术领域。 –