2015-02-06 1 views
0

Для DB2Как получить имена столбцов и объединить имена столбцов, разделенные запятой, которая имеет значение «Y» для каждой строки?

Как получить имена столбцов, содержащие «Y» для каждой строки, и объединить их в список с разделителями-запятыми?

Например, когда базовая таблица выглядит следующим образом:

person | apple | orange | grapes 
-------------------------------- 
1  Y  Y 
2     Y 
3       Y 

Результат запроса должен выглядеть следующим образом:

person | fruits 
--------------------------- 
1   apple,orange 
2   orange 
3   grapes 

Я попытался COALESCE, но это не работает, так как он объединялся бы в Y.

Я пробовал CASE WHEN f.apple ='Y' THEN 'apple' WHEN f.orange = 'Y' THEN 'orange' WHEN f.grapes = 'Y' THEN 'grapes' END AS fruits , но вышеизложенное давало бы только одно из утверждений WHEN.

Я попытался CASE WHEN f.apple ='Y' THEN concat('apple,') WHEN f.orange = 'Y' THEN concat('orange,') when f.grapes = 'Y' THEN concat('grapes,') END AS fruits , но это не работает, очевидно, потому, что это ошибка синтаксиса (относительно новый для SQL) и до сих пор, только один из WHEN с будет работать.

ответ

0

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 флаги вообще, вы можете изменить окончательный/внешний SELECT для выполнения LEFT OUTER JOIN от originalTable до fruitCTE на столбце person.