2016-07-29 3 views
0

ich einen Auftrag Tisch haben und ich bin Aggregation diese Tabelle von dieser Abfrage:SQL - Fügen Sie eine nicht existiert Linie in einer Aggregation

SELECT dtdate, idsku, sum(vlorder) as vlorder, sum(qtditem) as qtditem 
FROM order 
GROUP BY dtdate, idsku 

Und ich bin immer diese Ergebnisse:

dtdate idsku vlorder qtditem 
01/01/2016 1 4 8 
02/01/2016 1 5 10 
03/01/2016 1 3 6 
04/01/2016 1 2 4 
05/01/2016 1 3 6 
06/01/2016 1 1 2 

Aber ich habe keine Ergebnisse für 07/01/2016 und Idsku = 1, weil nicht auf der Datenbank existiert (klingt Dummy). Und ich muss diese "leere" Linie 07/01/2016 1 0 0, wie folgt einschließen:

dtdate idsku vlorder qtditem 
01/01/2016 1 4 8 
02/01/2016 1 5 10 
03/01/2016 1 3 6 
04/01/2016 1 2 4 
05/01/2016 1 3 6 
06/01/2016 1 1 2 
07/01/2016 1 0 0 

Ist das möglich?

+0

Sie sollten wahrscheinlich eine Kalender-Tabelle (google it) verwenden und 'left join', um alle Daten zu erhalten. Mit 'ISNULL' oder' COALESCE' können Sie 'NULL' in' 0' ändern. – HoneyBadger

+0

Ich mache dies und bekomme 07/01/2016 \t Null \t Null \t Null. Ich habe keine Idsku in der Linie zu koaleszieren. –

Antwort

0

In Postgres können Sie generate_series() verwenden:

select g.mon, o.idsku, 
     sum(o.vlorder) as vlorder, sum(o.qtditem) as qtditem 
from generate_series('2016-01-01'::timestamp, '2016-07-01'::timestamp, 
        interval '1' month) g(mon) left join 
    orders o 
    on o.dtdate = g.mon 
group by g.mon, idsku; 

Wenn Ihre Daten sind nicht auf dem ersten Tag des Monats, dann können Sie date_trunc('day', o.dtdate) = g.mon verwenden.

+0

Ich habe das Datum '2016-07-01' nicht bestellt, daher ist mein Idsku null und ich muss den Wert wissen. Ist möglich? –

+0

@ gabriel.almeida. . . Ich verstehe deinen Kommentar nicht. –

Verwandte Themen