listagg в SQL для группировки строк в одну строку

у меня есть таблица 1, показанная ниже

Name  role       F1     status1 status 2 
sam   player     yes      null   null
sam   admin      yes     null    null
sam   guest       no      x       x

Я хочу, чтобы результат был

Name  role         status1 status 2 
  sam admin,player    x       x

я сделал запрос, чтобы list_agg роль в одной строке. но статус нулевой для Сэма, чтобы показать, когда F1 = 'да'

запрос, который я использовал

 select name,list_agg(role,',') within group(order by name),max(status1),max(status2)
from table 1 where F1='yes'
group by name 

но я получаю что-то вроде этого

name role          status1   status2 
sam  admin,player     null      null

я хочу, чтобы где работать только в столбце роли, а max (status1) был в статусе 1, то есть «x». пожалуйста, помогите мне. спасибо


person Eswar Vignesh    schedule 27.05.2016    source источник
comment
Есть что-то, что вы нам не говорите? Я был бы очень удивлен, если бы вы не получили сообщение об ошибке при выполнении вашего запроса. Вы группируете по имени, но пытаетесь показать неагрегированные поля, такие как water-access, а не min(water-access) или max(water-access) и т.п.   -  person Thorsten Kettner    schedule 27.05.2016
comment
@ThorstenKettner.sry, я обновил вопрос. пожалуйста, помогите мне   -  person Eswar Vignesh    schedule 27.05.2016
comment
Используйте запрос Тима. Замените LISTAGG(Role, ',') на LISTAGG(CASE WHEN F1 = 'yes' THEN Role END, ','), чтобы добавлять роли в строку только в том случае, если F1 имеет значение «да».   -  person Thorsten Kettner    schedule 27.05.2016


Ответы (2)


Вы можете попробовать использовать LISTAGG() в запросе GROUP BY:

SELECT Name,
    LISTAGG(Role, ',') WITHIN GROUP (ORDER BY Role) "Role"
    MAX(CASE WHEN water_access = 'Y' THEN 'Y' ELSE NULL END) "water_access",
    MAX(CASE WHEN food_access = 'Y'  THEN 'Y' ELSE NULL END) "food_access",
    MAX(CASE WHEN power_access = 'Y' THEN 'Y' ELSE NULL END) "power_access"
FROM yourTable
GROUP BY Name
ORDER BY Name DESC

Обратите внимание, что я решил упорядочить агрегирование каждой группы Name с помощью Role, потому что вы не предоставили нам ни одного столбца, который мог бы дать порядок, который вы показываете в ожидаемом выводе.

Второе примечание: MAX() в Oracle игнорирует значения NULL, поэтому его можно использовать в сводной таблице для правильной идентификации значений Y, которые вы хотите отобразить.

person Tim Biegeleisen    schedule 27.05.2016

попробуй это...

 select * from table_name pivot(sum(name) for role
person Dheerendra Yadav    schedule 27.05.2016