简体   繁体   English

Select 并合并 DB2 中的多列

[英]Select and merge multiple columns in DB2

here is my table:这是我的桌子:

ID ID SEQ序列号 DATE_FROM DATE_FROM DATE_TO DATE_TO NOTES笔记
ELEM1 ELEM1 1 1个 2022-04-01 2022-04-01 2023-03-31 2023-03-31 First part第一部分
ELEM1 ELEM1 2 2个 2022-04-01 2022-04-01 2023-03-31 2023-03-31 Second part第二部分
ELEM1 ELEM1 3 3个 2022-04-01 2022-04-01 2023-03-31 2023-03-31 Third part第三方
ELEM2 ELEM2 1 1个 2018-11-12 2018-11-12 2099-12-31 2099-12-31 First part第一部分
ELEM2 ELEM2 2 2个 2018-11-12 2018-11-12 2099-12-31 2099-12-31 Second part第二部分
ELEM2 ELEM2 3 3个 2018-11-12 2018-11-12 2099-12-31 2099-12-31 Third part第三方
ELEM2 ELEM2 4 4个 2018-11-12 2018-11-12 2099-12-31 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:我想通过合并和连接SEQNOTES来返回每个ID ,这样我 select 只有IDDATE_FROMDATE_TONOTES这样的:

ID ID DATE_FROM DATE_FROM DATE_TO DATE_TO NOTES笔记
ELEM1 ELEM1 2022-04-01 2022-04-01 2023-03-31 2023-03-31 First part Second part Third part第一部分 第二部分 第三部分
ELEM2 ELEM2 2018-11-12 2018-11-12 2099-12-31 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以下查询依赖于

  • if SEQ > 1 exists then SEQ - 1 also exists如果 SEQ > 1 存在,则 SEQ - 1 也存在
  • SEQ is unique SEQ 是唯一的

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)

DB<>Fiddle 数据库<>小提琴

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。我不确定您是如何使用它的,但它应该适合您。

Here is the demo 这是演示

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM