2016-08-07 31 views
1

Ich habe diese Tabelle (elev_table):einfügen Nullwert Zeilen Spaltenwert Postgres für fehlende

country  | cat | elev 
--------------+-----+---------- 
USA   | 0 | 41.46 
USA   | 1 | 878.90 
USA   | 2 | 78.01  
CAN   | 0 | 46.00 
CAN   | 1 | 78.92 
CAN   | 2 | 78.01 
CAN   | 4 | 667.77 
CAN   | 5 | 10.80 

Wie kann ich eine Abfrage erstellen, die gleiche Tabelle zurückzukehren, gefüllt mit Katze Werte fehlt? Die cat-Spalte muss Werte von (-1 bis 5) haben, aber nicht jeder Länderwert enthält jeden cat-Wert.

Wesentlichen für jedes Land in meinem Tisch muss ich Zeilen mit Höhenwerte für jeden Katzen Wert von -1 bis 5 .....

Zum Beispiel habe ich die resultierende Tabelle aussehen soll:

country  | cat | elev 
--------------+-----+---------- 
USA   | -1 |  0 
USA   | 0 | 41.46 
USA   | 1 | 878.90 
USA   | 2 | 78.01 
USA   | 3 |  0 
USA   | 4 |  0 
USA   | 5 |  0 
CAN   | -1 |  0 
CAN   | 0 | 46.00 
CAN   | 1 | 78.92 
CAN   | 2 | 78.01 
CAN   | 3 |  0 
CAN   | 4 | 667.77 
CAN   | 5 | 10.80 

Ich glaube, 0 wäre eine gute Darstellung, aber vielleicht wäre NULL besser?

Ich habe die folgende Abfrage versucht, aber das schafft keine fehlenden Zeilenwerte für jedes Land ... Ich weiß, ich vermisse etwas, aber kann nicht scheinen, was herauszufinden !!!

with cat_series as(
    select generate_series(-1,5) as fullcat 
) 

select fullcat, coalesce(sum(t.elev),0), t.country 
from cat_series 
    left join elev_table t on cat_series.fullcat=t.cat 
group by fullcat, t.country 
order by fullcat, t.country; 

Noch ziemlich neu zu postgres, sql. Jede Hilfe oder Hinweise wären willkommen!

Antwort

0

können Sie einen cross join von einem left join gefolgt verwenden:

select c.country, g.cat, coalesce(sum(t.elev), 0) 
from (select distinct country from elev_table) c cross join 
    generate_series(-1, 5) as g(cat) left join 
    elev_table et 
    on et.country = c.country and et.cat = g.cat 
group by c.country, g.cat; 

ich die group by in der Abfrage nach links, obwohl basierend auf den Beispieldaten, dies ausreichend ist:

select c.country, g.cat, coalesce(t.elev, 0) 
from (select distinct country from elev_table) c cross join 
    generate_series(-1, 5) as g(cat) left join 
    elev_table et 
    on et.country = c.country and et.cat = g.cat; 

Sie entfernen die coalesce(), wenn Sie NULL zu 0 bevorzugen.

+0

Sagen wir, es gibt eine zusätzliche Spalte in der elev_table. Würden keine where-Anweisungen dazu führen, dass die fehlenden Zeilen nicht gefüllt werden? zum Beispiel: in der unteren Tabelle WHERE et.color ist nicht null) country | Katze | Höhe | Farbe -------------- + ----- + ----------- + ------- USA | 0 | 41.46 | blau USA | 2 | 78.01 | CAN | 0 | 46,00 | blau CAN | 1 | 78,92 | rot CAN | 2 | 78.01 | CAN | 4 | 667.77 | blau CAN | 5 | 10.80 | –

+0

@ F. Ronald. . . Eine 'WHERE'-Klausel würde die Ergebnisse beeinflussen. Wenn Sie eine andere Frage haben, sollten Sie sie vielleicht als Frage stellen. –