将多条记录合并为一条
我有如下的DB2表以及数据,大致如下所示:
| KID_ID | F_NAME | L_NAME | TOY_NAME | HAS_IT |
|---|---|---|---|---|
| 1 | ABC | DEF | CAR | NO |
| 1 | ABC | DEF | BALL | NO |
| 2 | HIJ | LMN | CAR | YES |
| 2 | HIJ | LMN | BALL | NO |
| 3 | XYZ | 123 | CAR | NO |
| 3 | XYZ | 123 | BALL | YES |
能否请你帮忙写一个DB2 SQL,让每个孩子占一行。
结果应该看起来是这样的:
| KID_ID | F_NAME | L_NAME | TOYS |
|---|---|---|---|
| 1 | ABC | DEF | CAR:NO BALL:NO |
| 2 | HIJ | LMN | CAR:YES BALL:NO |
| 3 | XYZ | 123 | CAR:NO BALL:YES |
我有这段DB2 SQL,但却得到这个错误:
DB2 SQL16003N an expression of data type "( item(), item() + )" cannot be used when the data type "item()" is expected in the context
SELECT
KID_ID,
F_NAME,
L_NAME,
RTRIM(
XMLCAST(
XMLAGG(
XMLELEMENT(NAME X,
TOY_NAME || ':' || HAS_IT || ' '
)
ORDER BY TOY_NAME
) AS VARCHAR(2000)
), ' ') AS TOYS_LIST
FROM
KIDS_TOYS
GROUP BY
KID_ID, F_NAME, L_NAME
ORDER BY
KID_ID;
解决方案
错误在于 XMLCAST 是一个“一次一个”的工具,但你的 XMLAGG 产生了一个巨大的项列表。
最简单的修复方法是停止使用复杂的XML函数,改用LISTAGG。把LISTAGG看作一个“字符串拼接”函数……它把多行文本拼接成一行。
SELECT
KID_ID,
F_NAME,
L_NAME,
LISTAGG(TOY_NAME || ':' || HAS_IT, ' ')
WITHIN GROUP(ORDER BY TOY_NAME) AS TOYS_LIST
FROM
KIDS_TOYS
GROUP BY
KID_ID, F_NAME, L_NAME
ORDER BY
KID_ID;
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。