繁体   English   中英

Select 并合并 DB2 中的多列

[英]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 第四部分

我想通过合并和连接SEQNOTES来返回每个ID ,这样我 select 只有IDDATE_FROMDATE_TONOTES这样的:

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 可用。 以下查询依赖于

  • 如果 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)

数据库<>小提琴

因为它已经写在评论中,所以您需要使用 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

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

SQLCODE = -4700

解释

在激活所需的 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.

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