[英]Select and merge multiple columns in DB2
here is my table:这是我的桌子:
ID ![]() |
SEQ![]() |
DATE_FROM ![]() |
DATE_TO ![]() |
NOTES![]() |
---|---|---|---|---|
ELEM1 ![]() |
1 ![]() |
2022-04-01 ![]() |
2023-03-31 ![]() |
First part![]() |
ELEM1 ![]() |
2 ![]() |
2022-04-01 ![]() |
2023-03-31 ![]() |
Second part![]() |
ELEM1 ![]() |
3 ![]() |
2022-04-01 ![]() |
2023-03-31 ![]() |
Third part![]() |
ELEM2 ![]() |
1 ![]() |
2018-11-12 ![]() |
2099-12-31 ![]() |
First part![]() |
ELEM2 ![]() |
2 ![]() |
2018-11-12 ![]() |
2099-12-31 ![]() |
Second part![]() |
ELEM2 ![]() |
3 ![]() |
2018-11-12 ![]() |
2099-12-31 ![]() |
Third part![]() |
ELEM2 ![]() |
4 ![]() |
2018-11-12 ![]() |
2099-12-31 ![]() |
Forth part![]() |
I'd like to return each ID
by merging and concatenating SEQ
and NOTES
, so that I select only ID
, DATE_FROM
, DATE_TO
, NOTES
like that:我想通过合并和连接
SEQ
和NOTES
来返回每个ID
,这样我 select 只有ID
, DATE_FROM
, DATE_TO
, NOTES
这样的:
ID ![]() |
DATE_FROM ![]() |
DATE_TO ![]() |
NOTES![]() |
---|---|---|---|
ELEM1 ![]() |
2022-04-01 ![]() |
2023-03-31 ![]() |
First part Second part Third part![]() |
ELEM2 ![]() |
2018-11-12 ![]() |
2099-12-31 ![]() |
First part Second part Third part Forth part![]() |
Then, I'll insert that result to another table!然后,我会将结果插入到另一个表中!
I tried to use GROUP BY
, but I'm not good at SQL queries and I don't know how to use it:我尝试使用
GROUP BY
,但我不擅长 SQL 查询,我不知道如何使用它:
SELECT ID, DATE_FROM, DATE_TO, NOTES
FROM MYTABLE
GROUP BY ID, NOTES
Thanks谢谢
If LISTAGG is not available maybe recursive CTE are.如果 LISTAGG 不可用,也许递归 CTE 可用。 The following query relies on
以下查询依赖于
query:询问:
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)
AS it was already written in comments you need to use LISTAGG FUNCTION. I am not sure how did you used it but it should work for you.因为它已经写在评论中,所以您需要使用 LISTAGG FUNCTION。我不确定您是如何使用它的,但它应该适合您。
And here is the code from that demo:这是该演示中的代码:
select id, min(dat_from), max(dat_to), listagg(notes, ',')
from test
group by id
Watch out which columns you use in group by.注意您在分组依据中使用了哪些列。 You can not group by column Notes and use it in listagg function.
您不能按 Notes 列分组并在 listagg function 中使用它。
If your title is correct "Select and merge multiple columns in DB2" then you can concatenate two columns like this:如果您的标题是正确的“选择并合并 DB2 中的多个列”,那么您可以像这样连接两列:
select id, min(dat_from), max(dat_to), listagg(notes|| ' ' || id, ',')
from test
group by id
But you have shown us your desired result where we can assume you do not want this...但是你已经向我们展示了你想要的结果,我们可以假设你不想要这个......
SQLCODE = -4700 : SQLCODE = -4700 :
Explanation
解释
An attempt was made to use a new capability before the required function level is activated.
在激活所需的 function 级别之前尝试使用新功能。 Capabilities that are introduced in a Db2 function level cannot be used before that function level is activated.
Db2 function 级别中引入的功能在激活 function 级别之前不能使用。
Seems, that you use Db2 for Z/OS 12 (and not Db2 for LUW 10.5.0.9 as you mentioned), where LISTAGG is available with FL501
which is not activated in your system.似乎您对 Z/OS 12 使用 Db2(而不是您提到的 LUW 10.5.0.9 使用 Db2),其中LISTAGG可用于未在您的系统中激活的
FL501
。
Try XMLAGG as alternative.尝试使用XMLAGG作为替代方案。 This should work as is, if you uncomment the commented out block.
如果您取消对注释掉的块的注释,这应该可以正常工作。
/*
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.