我正在使用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