Db2 如何获取列名并连接由每行值为“Y”的逗号分隔的列名?

Db2 如何获取列名并连接由每行值为“Y”的逗号分隔的列名?,db2,Db2,对于DB2 如何获取每行包含“Y”的列名,并将它们连接到逗号分隔的列表中 例如,当基表如下所示时: person | apple | orange | grapes -------------------------------- 1 Y Y 2 Y 3 Y person | fruits --------------------------- 1 apple,ora

对于DB2

如何获取每行包含“Y”的列名,并将它们连接到逗号分隔的列表中

例如,当基表如下所示时:

person | apple | orange | grapes
--------------------------------
1        Y        Y
2                 Y
3                          Y
person  | fruits
---------------------------
1         apple,orange
2         orange
3         grapes
查询结果需要如下所示:

person | apple | orange | grapes
--------------------------------
1        Y        Y
2                 Y
3                          Y
person  | fruits
---------------------------
1         apple,orange
2         orange
3         grapes
我试着合并,但没有成功,因为它会合并成Y

当f.apple='Y'然后是'apple'时,我试过这个案子 当f.orange='Y'时,则为'orange' 当f.grapes='Y'时,则为'grapes' 结为果实 但是上面只返回一个WHEN语句

我试过这个案子,f.apple='Y'然后是concat'apple,' 当f.orange='Y'时,则concat'orange,' 当f.grapes='Y'时,则concat'grapes,' 结为果实 但这显然不起作用,因为这是一个语法错误,对SQL来说还是比较新的,而且只有一个when可以起作用。

如果每个人的值都可以表示为多行表达式,则LISTAGG聚合函数将快速完成此任务:

WITH fruitCTE (person, fruitname) AS (
    SELECT person, 'apple' FROM originalTable WHERE apple = 'Y'
    UNION ALL
    SELECT person, 'orange' FROM originalTable WHERE orange = 'Y'
    UNION ALL
    SELECT person, 'grapes' FROM originalTable WHERE grapes = 'Y'
)
SELECT person, 
    LISTAGG( fruitname, ',' ) 
        WITHIN GROUP ( ORDER BY fruitname ASC )
    AS fruits  
FROM fruitCTE
GROUP BY person
;
如果您的查询还需要显示完全没有Y标志的人员,则可以修改final/outer SELECT,以在person列上执行从Originatable到Fruicte的左外部联接