Si vous ne voulez vraiment pas une table.
Sur Oracle, vous pouvez faire quelque chose comme:
select D.D, count(T.CompareDate)
from (select to_date('2009-07-01', 'YYYY-MM-DD') + LEVEL - 1 as D
from dual
connect by LEVEL <= 30) D
left outer join T ON T.CompareDate = D.D
group by D.D
Lorsque la date est à l'intérieur to_date la date de départ, et vous tester contre niveau pour le nombre de jours que vous voulez dans vos résultats.
Sur SQL Server 2005/2008:
; with X1 (X) as
(select 1 union all select 1)
, X2 (X) as
(select 1 from X1 a cross join X1 b)
, X4 (X) as
(select 1 from X2 a cross join X2 b)
, X8 (X) as
(select 1 from X4 a cross join X4 b)
, X16 (X) as
(select 1 from X8 a cross join X8 b)
, NUM (N) as
(select row_number() over (order by X) from X16)
, D (D) as
(select dateadd(day, N-1, '20090701')
from NUM
where NUM.N <= 30)
select D.D, count(T.CompareDate)
from D
left outer join T on T.CompareDate = D.D
group by D.D
La clause with
est de construire les dates. La date spécifiée dans le dateadd
est la date de début, et le nombre de jours est testé au NUM.N <=30
. Vous pouvez également tester contre la date de fin where dateadd(day, N-1, StartDate) <= EndDate
.
Je recommanderais d'encapsuler la clause with pour créer les plages en tant que fonction de valeur de table en ligne.
La génération du nombre est basée sur le code que j'ai vu d'Itzik Ben-gan. Chaque X vous donne un nombre de lignes égal à la puissance de 2 du nombre X (X1 = 2 lignes et X8 = 256 lignes). Si vous avez besoin de plus de 65 536, vous devrez ajouter plus de jointures croisées. Si vous n'avez jamais besoin de plus de 256, vous pouvez éliminer X16.En outre, si vous disposez d'une table de nombres, vous pouvez utiliser cette arithmétique et cette date pour générer les dates dont vous avez besoin à la volée.
Je devais choisir une seule réponse, mais toutes étaient très bonnes et très intéressantes. Merci à tout le monde. – Deane