2009-11-23 4 views
2

J'ai un tableau de messages sur un site Web, où chaque entrée a sa date de création.Nombre d'articles par date, sans aucun intervalle dans les dates

Je veux retourner une table comme:

Date   Posts 
16-11-2009 5 
17-11-2009 0 
18-11-2009 4 
etc 

Mais je suis mal à trouver le bon SQL. Je peux facilement obtenir le nombre de messages regroupés par date, mais cela ne retourne pas les dates quand il n'y a pas de messages (par exemple, il manque le 17-11-2009).

Y at-il un SQL qui me donnera ce que je veux? Ou devrais-je utiliser du code non SQL pour gérer les jours sans messages?

Répondre

3
WITH dates AS 
     (
     SELECT CAST('2009-01-01' AS DATETIME) AS d 
     UNION ALL 
     SELECT DATEADD(day, 1, d) 
     FROM dates 
     WHERE d <= GETDATE() 
     ) 
SELECT d, COUNT(posts.id) 
FROM dates 
LEFT JOIN 
     posts 
ON  posts.date >= d 
     AND posts.date < DATEADD(day, 1, d) 
GROUP BY 
     d 
OPTION (MAXRECURSION 0) 
0

Un truc simple est d'avoir une table avec toutes les dates dont vous avez besoin ... et puis utilisez une jointure externe entre ce tableau et celui avec les messages

Si je me souviens bien joe celko conseille quelque chose comme ça pour les calculs de vacances et al.

Questions connexes