2017-01-12 8 views
0

このような質問がいくつかありますが、私の特定の問題に対する答えが見つかりません。MySQL - 日付のゼロカウントを含む

は以下の表を考えてみましょう:

|    DateOfSale |   food | customerid | 
|---------------------------|--------------|------------| 
| January, 03 2017 00:00:00 |  pizza |   1 | 
| January, 03 2017 00:00:00 |  pizza |   2 | 
| January, 03 2017 00:00:00 |  pizza |   3 | 
| January, 03 2017 00:00:00 | fish & chips |   4 | 
| January, 02 2017 00:00:00 |  pizza |   4 | 
| January, 02 2017 00:00:00 |  pizza |   4 | 
| January, 02 2017 00:00:00 |  pizza |   5 | 
| January, 02 2017 00:00:00 | fish & chips |   6 | 
| January, 01 2017 00:00:00 |  pizza |   7 | 
| January, 01 2017 00:00:00 |  pizza |   8 | 
| January, 01 2017 00:00:00 |  pizza |   9 | 

私たちはピザや魚&チップを販売しています。

&個の魚を1月1日に下記の結果で販売していないことに気づくでしょうが、私は0個の販売台数を見たいと思っています。また、1月4日の売上は記録されておらず、ピザと魚の両方について0を表示したい&チップ。これが私が日付参照テーブルから日付を取得する理由です - その結果、売上がない場合でも日付が存在します。

SELECT DATE(d.thedate) as DateOfSale, f.food, count(s.customerid) as Sales 
FROM ref_date d 
LEFT JOIN sales s on d.thedate = s.saledate 
INNER JOIN foods f on s.foodid = f.id 
GROUP BY DATE(d.thedate), f.food 

とデータとの完全なフィドルはここにある:

|    DateOfSale |   food | Sales | 
|---------------------------|--------------|-------| 
| January, 01 2017 00:00:00 |  pizza |  3 | 
| January, 02 2017 00:00:00 | fish & chips |  1 | 
| January, 02 2017 00:00:00 |  pizza |  3 | 
| January, 03 2017 00:00:00 | fish & chips |  1 | 
| January, 03 2017 00:00:00 |  pizza |  3 | 

この結果のコードはhttp://sqlfiddle.com/#!9/ff9dc/2

答えて

0

あなたは、すべての可能な日付としてcross join食品は売上テーブルを結合する左することができます0個の行を取得します。ここで

SELECT DATE(d.thedate) as DateOfSale, f.food, count(s.customerid) as Sales 
FROM ref_date d 
cross join foods f 
LEFT JOIN sales s on s.saledate=d.thedate and s.foodid=f.id 
GROUP BY DATE(d.thedate), f.food 
order by 1,2 
+0

をありがとう!彼らが私の頭を傷つけるので、私は十字結合を嫌う。まだ私として混乱しているこれを読んでいる人のために、ここにいくつかの良い読書があります:http://stackoverflow.com/questions/17759687/cross-join-vs-inner-join-in-sql-server-2008 – Warren

1

あなたが行く:

SELECT d.thedate AS DateOfSale, f.Food, COUNT(s.customerid) AS Sales 
FROM ref_date d 
JOIN foods f 
LEFT JOIN sales s ON s.saledate = d.thedate AND s.foodid = f.id 
GROUP BY DateOfSale, Food; 

出力:

 
|     thedate |   food | Sales | 
|---------------------------|--------------|-------| 
| January, 01 2017 00:00:00 | fish & chips |  0 | 
| January, 01 2017 00:00:00 |  pizza |  3 | 
| January, 02 2017 00:00:00 | fish & chips |  1 | 
| January, 02 2017 00:00:00 |  pizza |  3 | 
| January, 03 2017 00:00:00 | fish & chips |  1 | 
| January, 03 2017 00:00:00 |  pizza |  3 | 
| January, 04 2017 00:00:00 | fish & chips |  0 | 
| January, 04 2017 00:00:00 |  pizza |  0 | 

SQL Fiddle

関連する問題