2016-08-18 2 views
0

ich eine Abfrage, die für mein Bedürfnis gemacht:Postgresql CASE in der gleichen Zeile setzen

select distinct min(term1_id), term2_id, 
     case when distance = 0 then term2_id end as dist0, 
     case when distance = 1 then term2_id end as dist1, 
     case when distance = 2 then term2_id end as dist2, 
     case when distance = 3 then term2_id end as dist3, 
     case when distance = 4 then term2_id end as dist4, 
     case when distance = 5 then term2_id end as dist5, 
     case when distance = 6 then term2_id end as dist6, 
     case when distance = 7 then term2_id end as dist7, 
     case when distance = 8 then term2_id end as dist8, 
     case when distance = 9 then term2_id end as dist9, 
     case when distance = 10 then term2_id end as dist10, 
     case when distance = 11 then term2_id end as dist11, 
     case when distance = 12 then term2_id end as dist12, 
     case when distance = 13 then term2_id end as dist13, 
     case when distance = 14 then term2_id end as dist14, 
     case when distance = 15 then term2_id end as dist15 
from graph_path 
group by term2_id, distance 
order by term2_id; 

Legen Sie es, die Ergebnisse in „Zeilen“ wie folgt zurück:

Term1_id dist0 dist1 dist2 
1   1 
1    5 
1    118 
1    12823 
1    40006 
1      6 
1      7 

Wie kann ich alles setzen in einer Reihe so?

Term1_id dist 0 dist1 dist2 
    1  1  5  6 
    1  118 7  etc... 

Gibt es eine Möglichkeit, es kompakt zu machen? Anstatt für jede dist eine Zeile zu erstellen?

+0

Keine Notwendigkeit für diese DISTINCT, Ihre GROUP BY gibt keine Duplikate. – jarlh

Antwort

1

Verwendung Aggregation:

select term1_id, 
     max(case when distance = 0 then term2_id end) as dist0, 
     max(case when distance = 1 then term2_id end) as dist1, 
     max(case when distance = 2 then term2_id end) as dist2, 
     max(case when distance = 3 then term2_id end) as dist3, 
     max(case when distance = 4 then term2_id end) as dist4, 
     max(case when distance = 5 then term2_id end) as dist5, 
     max(case when distance = 6 then term2_id end) as dist6, 
     max(case when distance = 7 then term2_id end) as dist7, 
     max(case when distance = 8 then term2_id end) as dist8, 
     max(case when distance = 9 then term2_id end) as dist9, 
     max(case when distance = 10 then term2_id end) as dist10, 
     max(case when distance = 11 then term2_id end) as dist11, 
     max(case when distance = 12 then term2_id end) as dist12, 
     max(case when distance = 13 then term2_id end) as dist13, 
     max(case when distance = 14 then term2_id end) as dist14, 
     max(case when distance = 15 then term2_id end) as dist15 
from graph_path 
group by term1_id 
order by term1_id; 

Auf der Grundlage der Logik in der Abfrage, ich glaube, Sie tatsächlich von term1_id aggregieren möchten.

+0

Perfekt danke! – xCloudx8

Verwandte Themen