2016-05-27 11 views
2

Ich habe eine Tabelle 1 unten dargestelltlistagg in SQL zu Gruppenzeilen in einer Zeile

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

möchte ich das Ergebnis

Name role   status1 status 2 
    sam admin,player x  x 

i eine Abfrage gemacht haben, um die Rolle list_agg in einem row.but der Status ist für sam null, wenn F1 zu zeigen = 'yes' i

Abfrage

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

aber ich bekomme so etwas wie dieses

name role   status1 status2 
sam admin,player  null  null 

i das, wo wollen nur auf Rolle Spalte arbeiten und die max (status1) in status1 zu mir ie'x'.please helfen .thank Sie

+0

Gibt es etwas, was Sie uns nicht sagen? Ich wäre sehr überrascht, wenn Sie beim Ausführen Ihrer Abfrage keine Fehlermeldung erhalten würden. Sie gruppieren nach Namen, aber versuchen, nicht aggregierte Felder anzuzeigen, z. B. "Wasserzugang" und nicht "Min. (Wasserzugang)" oder "Max. Wasserzugang" oder Ähnliches. –

+0

@ ThorstenKettner.sry ich habe das update the question.please help me –

+1

Verwenden Sie die Abfrage von Tim. Ersetzen Sie 'LISTAGG (Role, ',')' durch 'LISTAGG (CASE WHEN F1 = 'ja' THEN Role END, ',')', um Rollen nur dann der Zeichenfolge hinzuzufügen, wenn F1 ja ist. –

Antwort

2

Sie können versuchen, LISTAGG() innerhalb einer GROUP BY Abfrage:

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 

Beachten Sie, dass ich die Aggregation jeder Name Gruppe mit der Role bestellen wollte, weil Sie uns keine Spalte zur Verfügung gestellt haben, die die Reihenfolge angeben könnte, die Sie in Ihrer erwarteten Ausgabe zeigen.

Zweite Anmerkung: MAX() in Oracle ignoriert NULL Werte, so kann es in der Pivot verwendet werden richtig die Y Werte zu identifizieren, die angezeigt werden soll.

1

versuchen this out ...

select * from table_name pivot(sum(name) for role 
Verwandte Themen