2017-09-11 23 views
4

の範囲の間でカウントし、何も存在しない場合は、0を選択し、現在、それは次のように出力します。選択は(今日は含まれるまで、最後の週)私は2つの日付の間のすべてのエントリをカウントしたい日付

+-------+------------+ 
| items | SellDate | 
+-------+------------+ 
| 1  | 2017-01-01 | 
+-------+------------+ 
| 3  | 2017-01-02 | 
+-------+------------+ 
| 1  | 2017-01-03 | 
+-------+------------+ 
| 5  | 2017-01-06 | 
+-------+------------+ 

しかし、私はこのような印刷何か必要があります。

+-------+------------+ 
| items | SellDate | 
+-------+------------+ 
| 1  | 2017-01-01 | 
+-------+------------+ 
| 3  | 2017-01-02 | 
+-------+------------+ 
| 1  | 2017-01-03 | 
+-------+------------+ 
| 0  | 2017-01-04 | 
+-------+------------+ 
| 0  | 2017-01-05 | 
+-------+------------+ 
| 5  | 2017-01-06 | 
+-------+------------+ 
| 0  | 2017-01-07 | 
+-------+------------+ 

を私のクエリは次のようになります。

SELECT 
    COUNT(Item.id) AS Items, 
    DATE(Item.sold_at) AS SellDate 
FROM Item 
WHERE Item.sold_at IS NOT NULL AND Item.sold_at BETWEEN DATE(DATETIME('now', 'localtime', '-6 days')) AND DATE(DATETIME('now', 'localtime', '+1 day')) 
GROUP BY SellDate 

何私は間違っている?

+0

「間違っている」ことは何もありません。 SQLは結果セットに入れる日付を構成しません。ソースデータに0の日付は存在しません。 –

+0

これを見てください。 https://stackoverflow.com/questions/2651249/wanted-to-get-all-dates-in-mysql-result –

答えて

2

これまでのところ、SQLite 3.8.3以降でrecursive common table expressionがサポートされていなければ、これは不可能です。対応するバージョンでは、日付範囲とアイテムリストを結合することでそれを行うことができます。

WITH RECURSIVE dates(date) AS (
    VALUES(DATE(DATETIME('now', 'localtime', '-6 days'))) 
    UNION ALL 
    SELECT date(date, '+1 day') 
    FROM dates 
    WHERE date < DATE(DATETIME('now', 'localtime', '+1 day')) 
) 
SELECT 
    date, 
    COUNT(Item.id) AS Items 
FROM 
    dates 
LEFT JOIN 
    Item 
ON 
    dates.date = Item.SellDate 
GROUP BY 
    SellDate 
+1

このソリューションは非常にうまくいっており、パフォーマンスは良好でした。私が少し調整したのは、「+1日」だった。私は明日私に与えていたので、私はそれを完全に取り除いた。行は 'どこの日付 Chax

関連する問題