在DB2中选择并合并多个列

siv3szwd  于 2022-11-07  发布在  DB2
关注(0)|答案(3)|浏览(248)

这是我table:
| 识别码|序列号|起始日期|终止日期|注解|
| - -|- -|- -|- -|- -|
| 元素1|一个|2022年4月1日|2023年3月31日|第一部分|
| 元素1| 2个|2022年4月1日|2023年3月31日|第二部分|
| 元素1|三个|2022年4月1日|2023年3月31日|第三部分|
| 元件2|一个|2018年11月12日|二〇九九年十二月三十一日|第一部分|
| 元件2| 2个|2018年11月12日|二〇九九年十二月三十一日|第二部分|
| 元件2|三个|2018年11月12日|二〇九九年十二月三十一日|第三部分|
| 元件2|四个|2018年11月12日|二〇九九年十二月三十一日|第四部分|
我想通过合并和连接SEQNOTES来返回每个ID,这样我只选择IDDATE_FROMDATE_TONOTES,如下所示:
| 识别码|起始日期|终止日期|注解|
| - -|- -|- -|- -|
| 元素1| 2022年4月1日|2023年3月31日|第二部分第三部分|
| 元件2| 2018年11月12日|二〇九九年十二月三十一日|第一部分第二部分第三部分第四部分|
然后,我会将该结果插入到另一个表中!
我尝试使用GROUP BY,但我不擅长SQL查询,也不知道如何使用它:

SELECT ID, DATE_FROM, DATE_TO, NOTES
FROM MYTABLE
GROUP BY ID, NOTES

谢谢

vsikbqxv

vsikbqxv1#

如果LISTAGG不可用,则可能是递归CTE。以下查询依赖于

  • 如果SEQ〉1存在,那么SEQ - 1也存在
  • SEQ是唯一

查询:

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

ar5n3qh5

ar5n3qh52#

由于它已经写在评论中,你需要使用LISTAGG函数。我不知道你是如何使用它的,但它应该为你工作。
Here is the demo
下面是该演示的代码:

select id, min(dat_from), max(dat_to), listagg(notes, ',')
from test
group by id

请注意您在group by中使用了哪些列。您不能在listagg函数中使用按列分组注解。
如果您的标题是正确的“Select and merge multiple columns in DB2”,那么您可以如下连接两个列:

select id, min(dat_from), max(dat_to), listagg(notes|| ' ' || id, ',')
from test
group by id

但你已经向我们展示了你想要的结果,我们可以假设你不想这样...

v9tzhpje

v9tzhpje3#

SQLCODE = -4700
说明
在激活所需的函数级别之前,尝试使用新功能。在激活Db2函数级别之前,不能使用该函数级别中引入的功能。
看起来,您使用的是Z/OS 12的Db2(而不是您提到的LUW www.example.com的Db210.5.0.9),其中LISTAGGFL501一起可用,而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

相关问题