SQL 使用过滤器将行连接成一个字段 (DB2)



我正在使用DB2 V7r1(所以不幸的是没有listagg(。我需要能够将项目(ItemNum(的所有描述都放在一个字符串逗号中。我有一个查询,我发现这种工作,但我无法按项目编号过滤结果。它可以很好地处理前 100 行数据,但如果我尝试过滤掉表中可能有 100,000 行的项目,则需要很长时间。

*编辑,我应该补充一点,此表包含 1,460,072 条记录,一个项目/操作最多可能有 60 个描述条目,所以如果有人知道一种可能预过滤结果的方法或更有效的方法,我将不胜感激

这是我的表格: 零件

ItemNum      OpSequence      DscNum    Description
A-123         10               2       Desc Line 1
A-123         10               4       Desc Line 2
A-123         10               6       Desc Line 3
A-123         20               2       Desc Line 1
A-123         20               4       Desc Line 2
Z-555         10               2       Desc Line 1
Z-555         10               4       Desc Line 2

这是我需要的结果(需要按 ItemNum 和 OpSequence 过滤(

ItemNum     OpSequence     Description
A-123        10            Desc Line 1, Desc Line 2, Desc Line 3

这是我使用的查询

with x (ItemNum, OpSequence, cnt, list, empno, len) as
(select z.ItemNum, z.OpSequence,
(select count(*) from PARTS y 
where y.ItemNum=z.ItemNum  
group by y.ItemNum),
cast(z.Description as varchar(100)),
rrn(z), 1  
from PARTS z 
where z.ItemNum = 'A-123'  (HERE IS WHERE I AM TRYING TO FILTER)
union all  
select x.ItemNum,
x.OpSequence,
x.cnt,
strip(x.list) ||', '|| e.Description,
rrn(e),
x.len+1   
from PARTS e, x 
where e.ItemNum = x.ItemNum and rrn(e) > x.empno   
)  
select ItemNum,OpSequence, list
from x 
where len=cnt  

虽然你没有listagg功能XML函数将解决你的问题。在 listagg 可用之前,XMLAGG(和 XMLGROUP(已经被使用,这些在 DB2 V7r1 中可用。

退房

  • XMLAGG
  • XMLGROUP

如果你对任何给定项目的行数有限,这个SQL将为你工作。 例如,如果您有超过 11 行,则需要扩展它

SELECT ItemNum, OpSequence
,      MAX(CASE WHEN DscNum = 1 THEN         Description ELSE '' END)
|| MAX(CASE WHEN DscNum = 2 THEN ', ' || Description ELSE '' END)
|| MAX(CASE WHEN DscNum = 3 THEN ', ' || Description ELSE '' END)
|| MAX(CASE WHEN DscNum = 4 THEN ', ' || Description ELSE '' END)
|| MAX(CASE WHEN DscNum = 5 THEN ', ' || Description ELSE '' END)
|| MAX(CASE WHEN DscNum = 6 THEN ', ' || Description ELSE '' END)
|| MAX(CASE WHEN DscNum = 7 THEN ', ' || Description ELSE '' END)
|| MAX(CASE WHEN DscNum = 8 THEN ', ' || Description ELSE '' END)
|| MAX(CASE WHEN DscNum = 9 THEN ', ' || Description ELSE '' END)
|| MAX(CASE WHEN DscNum =10 THEN ', ' || Description ELSE '' END)
|| MAX(CASE WHEN DscNum =11 THEN ', ' || Description ELSE '' END)
AS Description
FROM
PARTS
WHERE
ItemNum = 'A-123'
GROUP BY
ItemNum, OpSequence

我已经在 iSeries V7R1 上使用 XMLAGG 进行类似的事情,请尝试以下操作以开始使用。请注意,下面的内容没有说明您需要获取最小OpSequence,但确实为您提供了描述字段的逗号分隔列表。

SELECT    ItemNum,
OpSequence,
DscNum,
TRIM(REPLACE(  
REPLACE(  
REPLACE(  
XMLSERIALIZE(XMLAGG(XMLELEMENT(NAME "x", TRIM(Description)) ) AS VARCHAR(1000))  
, '</x><x>', ',')  
, '<x>', '')  
, '</x>', '')) AS Description
FROM x
GROUP BY ItemNum, OpSequence, DscNum

相关内容

  • 没有找到相关文章

最新更新