2017-05-14 4 views
1

Dies ist Tabelle in meiner DatenbankSQL anzeigen Nullwert Group By

+--+-------+---------+----------+--------+ 
|ID|OrderID|ProductID|OrderDate |Quantity| 
| 1|1  |1  |2017-01-01|1  | 
| 2|1  |1  |2017-01-01|6  | 
| 3|1  |1  |2017-01-03|9  | 
| 4|1  |1  |2017-01-04|3  | 
| 5|1  |1  |2017-01-05|5  | 
| 6|1  |1  |2017-01-07|1  | 
| 7|1  |1  |2017-01-09|2  | 
+--+-------+---------+----------+--------+ 

Ich möchte die Daten zeigen, wie diese

+----------+----+ 
|2017-01-01|7 | 
|2017-01-02|0 | 
|2017-01-03|9 | 
|2017-01-04|3 | 
|2017-01-05|5 | 
|2017-01-06|0 | 
|2017-01-07|1 | 
|2017-01-08|0 | 
|2017-01-09|2 | 
+----------+----+ 

Welche Abfrage, die ich verwenden sollte es möglich zu machen, ich habe versucht zu verwenden, Gruppe von OrderDate, aber wenn es Null ist, zeigt es nicht

+3

benötigen Sie eine Datteltabelle, um dies zu tun. Hast du eine solche Tabelle in deiner Datenbank? –

+0

gibt es noch eine andere Lösung ohne Dattentabelle zu erstellen? – madiluzi

+0

Was meinst du mit "* wenn es null *"? – melpomene

Antwort

1

Eine Möglichkeit, Datum zwischen einem bestimmten Datumsbereich zu generieren ist in this Antwort geben.

Entweder generieren Sie die Zeilen im laufenden Betrieb oder noch besser, erstellen Sie eine Kalendertabelle und verwenden Sie sie für solche Zwecke.

Hier ist eine Lösung auf der oben verlinkten Lösung basiert:

select d.day, sum(t.quantity) as quantity 
from (
    select min_orderdate + INTERVAL (a.a + (10 * b.a) + (100 * c.a)) DAY as Date 
    from (
     select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9 
     ) as a 
    cross join (
     select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9 
     ) as b 
    cross join (
     select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9 
     ) as c 
    join (
     select min(orderdate) min_orderdate, max(orderdate) max_orderdate from your_table 
     ) t on min_orderdate + INTERVAL (a.a + (10 * b.a) + (100 * c.a)) <= max_orderdate 
    ) d 
left join your_table t on d.day = t.orderdate 
group by d.day; 

hier ein Demo desselben ist.