2017-05-14 10 views
1

ではこれが私のデータベース内のテーブルであるSQLショーNULL値グループは

+--+-------+---------+----------+--------+ 
|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  | 
+--+-------+---------+----------+--------+ 

私は私がしました、私はそれを可能にするために使用する必要がありますどのようなクエリこの

+----------+----+ 
|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 | 
+----------+----+ 

のようなデータを表示したいですOrderDateでグループを使用しようとしましたが、nullがある場合は表示されません

+3

これを行うには、日付表が必要です。データベースにこのようなテーブルがありますか? –

+0

は、日付表を作成せずに他のソリューションですか? – madiluzi

+0

「*があるとき*」はどういう意味ですか? – melpomene

答えて

1

指定された期間の間に日付を生成する方法の1つはthisです。

あなたはその場で行を生成するか、またはより良い方法で、カレンダーテーブルを作成し、このような目的で使用します。ここ

は、上記連結ソリューションに基づくソリューションである:ここ

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; 

は同一のDemoあります。