【发布时间】:2020-03-30 20:36:34
【问题描述】:
我想通过以下方式从 2 列中获取数据:
Id1 id2 id3
1 1 2
2 3 null
2 4 null
O/p
Id1 data
1 1,2
2 3,4
这里id1是pk,id2,id3是其他表的fk。
【问题讨论】:
我想通过以下方式从 2 列中获取数据:
Id1 id2 id3
1 1 2
2 3 null
2 4 null
O/p
Id1 data
1 1,2
2 3,4
这里id1是pk,id2,id3是其他表的fk。
【问题讨论】:
按原样尝试:
WITH TAB (ID1, ID2, ID3) AS
(
VALUES
(1, 1, 2)
, (2, 3, NULL)
, (2, 4, NULL)
)
SELECT ID1, LISTAGG(DISTINCT ID23, ',') AS DATA
FROM
(
SELECT T.ID1, CASE V.ID WHEN 2 THEN T.ID2 ELSE T.ID3 END AS ID23
FROM TAB T
CROSS JOIN (VALUES 2, 3) V(ID)
)
WHERE ID23 IS NOT NULL
GROUP BY ID1;
【讨论】:
这有点奇怪——在同一行和多行之间连接。一种方法是先取消透视然后聚合:
select id1, listagg(id2, ',') within group (order by id2)
from (select id1, id2 from t union all
select id1, id3 from t
) t
where id2 is not null
group by id1;
假设只有id2可以是NULL,你也可以这样表达:
select id1,
listagg(concat(id2, coalesce(concat(',', id3), '')), ',') within group (order by id2)
from t
group by id1;
【讨论】:
listagg() 和 concat() 都是 DB2 函数,所以这些不是问题:ibm.com/support/knowledgecenter/SSEPEK_12.0.0/sqlref/src/tpc/…