2017-09-11 5 views
4

Je voudrais compter toutes les entrées entre 2 dates (la semaine dernière jusqu'à aujourd'hui inclus) et s'il n'y en a pas, sélectionnez 0. Actuellement, il imprime comme ceci:Select count entre la plage de la date

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

Cependant, je besoin de quelque chose qui impriment comme ceci:

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

Mon apparence de requête comme ceci:

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 

Qu'est-ce que Je fais mal?

+0

Vous ne faites rien de "faux". SQL ne crée pas de date à mettre dans le jeu de résultats. Les dates avec des zéros n'existent pas dans les données source. –

+0

s'il vous plaît regardez cela. https://stackoverflow.com/questions/2651249/wanted-to-get-all-dates-in-mysql-result –

Répondre

2

Jusqu'ici je sais que ce n'est pas possible sans un recursive common table expression pris en charge dans SQLite 3.8.3 et supérieur. Avec la version correspondante, vous pouvez le faire en joignant la plage de dates avec la liste des éléments:

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

Cette solution fonctionnait très bien et les performances étaient bonnes. Une chose que j'ai légèrement ajustée était le '+1 jour'. Je l'ai complètement enlevé puisqu'il me donnait demain. La ligne est 'WHERE date Chax