[英]Select and merge multiple columns in DB2
这是我的桌子:
ID | 序列号 | DATE_FROM | DATE_TO | 笔记 |
---|---|---|---|---|
ELEM1 | 1个 | 2022-04-01 | 2023-03-31 | 第一部分 |
ELEM1 | 2个 | 2022-04-01 | 2023-03-31 | 第二部分 |
ELEM1 | 3个 | 2022-04-01 | 2023-03-31 | 第三方 |
ELEM2 | 1个 | 2018-11-12 | 2099-12-31 | 第一部分 |
ELEM2 | 2个 | 2018-11-12 | 2099-12-31 | 第二部分 |
ELEM2 | 3个 | 2018-11-12 | 2099-12-31 | 第三方 |
ELEM2 | 4个 | 2018-11-12 | 2099-12-31 | 第四部分 |
我想通过合并和连接SEQ
和NOTES
来返回每个ID
,这样我 select 只有ID
, DATE_FROM
, DATE_TO
, NOTES
这样的:
ID | DATE_FROM | DATE_TO | 笔记 |
---|---|---|---|
ELEM1 | 2022-04-01 | 2023-03-31 | 第一部分 第二部分 第三部分 |
ELEM2 | 2018-11-12 | 2099-12-31 | 第一部分 第二部分 第三部分 第四部分 |
然后,我会将结果插入到另一个表中!
我尝试使用GROUP BY
,但我不擅长 SQL 查询,我不知道如何使用它:
SELECT ID, DATE_FROM, DATE_TO, NOTES
FROM MYTABLE
GROUP BY ID, NOTES
谢谢
如果 LISTAGG 不可用,也许递归 CTE 可用。 以下查询依赖于
询问:
with MYTABLE (ID, SEQ, DATE_FROM, DATE_TO, NOTES) as (
values
('ELEM1', 1, date '2022-04-01', date '2023-03-31', 'First part'),
('ELEM1', 2, date '2022-04-01', date '2023-03-31', 'Second part'),
('ELEM1', 3, date '2022-04-01', date '2023-03-31', 'Third part'),
('ELEM2', 1, date '2018-11-12', date '2099-12-31', 'First part'),
('ELEM2', 2, date '2018-11-12', date '2099-12-31', 'Second part'),
('ELEM2', 3, date '2018-11-12', date '2099-12-31', 'Third part'),
('ELEM2', 4, date '2018-11-12', date '2099-12-31', 'Forth part')
),
allnotes (ID, seq, ALLNOTES) as (
select ID, seq, varchar(notes, 4000) from MYTABLE where seq = 1
union all
select mytable.id, mytable.seq, allnotes.allnotes || ' ' || mytable.notes from allnotes, mytable where (mytable.id, mytable.seq) = (allnotes.id, allnotes.seq + 1)
),
groups as (
select id, min(date_from) date_from, max(date_to) date_to, max(seq) seq from mytable group by id
)
select groups.id, date_from, date_to, allnotes from groups inner join allnotes on (allnotes.id, allnotes.seq) = (groups.id, groups.seq)
因为它已经写在评论中,所以您需要使用 LISTAGG FUNCTION。我不确定您是如何使用它的,但它应该适合您。
这是该演示中的代码:
select id, min(dat_from), max(dat_to), listagg(notes, ',')
from test
group by id
注意您在分组依据中使用了哪些列。 您不能按 Notes 列分组并在 listagg function 中使用它。
如果您的标题是正确的“选择并合并 DB2 中的多个列”,那么您可以像这样连接两列:
select id, min(dat_from), max(dat_to), listagg(notes|| ' ' || id, ',')
from test
group by id
但是你已经向我们展示了你想要的结果,我们可以假设你不想要这个......
解释
在激活所需的 function 级别之前尝试使用新功能。 Db2 function 级别中引入的功能在激活 function 级别之前不能使用。
似乎您对 Z/OS 12 使用 Db2(而不是您提到的 LUW 10.5.0.9 使用 Db2),其中LISTAGG可用于未在您的系统中激活的FL501
。
尝试使用XMLAGG作为替代方案。 如果您取消对注释掉的块的注释,这应该可以正常工作。
/*
WITH MYTABLE (ID, SEQ, DATE_FROM, DATE_TO, NOTES) AS
(
SELECT 'ELEM1', 1, '2022-04-01', '2023-03-31', 'First part' FROM SYSIBM.SYSDUMMY1
UNION ALL SELECT 'ELEM1', 2, '2022-04-01', '2023-03-31', 'Second part' FROM SYSIBM.SYSDUMMY1
UNION ALL SELECT 'ELEM1', 3, '2022-04-01', '2023-03-31', 'Third part' FROM SYSIBM.SYSDUMMY1
UNION ALL SELECT 'ELEM2', 1, '2018-11-12', '2099-12-31', 'First part' FROM SYSIBM.SYSDUMMY1
UNION ALL SELECT 'ELEM2', 2, '2018-11-12', '2099-12-31', 'Second part' FROM SYSIBM.SYSDUMMY1
UNION ALL SELECT 'ELEM2', 3, '2018-11-12', '2099-12-31', 'Third part' FROM SYSIBM.SYSDUMMY1
UNION ALL SELECT 'ELEM2', 4, '2018-11-12', '2099-12-31', 'Forth part' FROM SYSIBM.SYSDUMMY1
)
*/
SELECT
ID
, MIN (DATE_FROM) AS DATE_FROM
, MAX (DATE_TO) AS DATE_TO
, SUBSTR (XMLSERIALIZE (XMLAGG (XMLTEXT (' ' || NOTES) ORDER BY SEQ) AS VARCHAR (1000)), 2) AS NOTES
FROM MYTABLE
GROUP BY ID
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.