将多条记录合并为一条

编程语言 2026-07-12

我有如下的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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章