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