2016-06-17 4 views
0

Ainsi, la requête d'origine était assez simple.La requête SQL pour renvoyer le nombre de lignes mensuelles est lente

select MONTH(DateColumn), COUNT(DateColumn) 
from myTable 
where YEAR(DateColumn) = '2014' 
group by MONTH(DateColumn) 
order by MONTH(DateColumn) 

Mais, l'un des mois n'a pas de données, et j'ai besoin d'avoir tous les 12 mois couverts. Donc je suis occupé à retravailler ça ... J'ai une solution, mais c'est douloureusement lent. Il doit y avoir un meilleur moyen.

select o.MonthCount, coalesce(d.total,0) from (
select top 12 ROW_NUMBER() over (order by (select 12)) as MonthCount from myTable 
) o outer apply (
select month(e.DateColumn) as mon, COUNT(e.DateColumn) as total 
from myTable e 
where YEAR(e.DateColumn) = '2013' 
and o.monthcount = month(e.DateColumn) 
group by MONTH(e.DateColumn) 
) d 

Répondre

3

Créez une table avec les 12 mois et rejoignez le résultat de la première requête. Quelque chose comme:

;with cte as (select 1 as m 
union select 2 
union select 3 
union select 4 
union select 5 
union select 6 
union select 7 
union select 8 
union select 9 
union select 10 
union select 11 
union select 12) 
select cte.m, ISNULL(m.c, 0) 
from cte left join (
select MONTH(DateColumn) mon, COUNT(DateColumn) c 
from myTable 
where YEAR(DateColumn) = '2014' 
group by MONTH(DateColumn)) i on i.mon = cte.m 
order by cte.m 
+0

Awesome! Cela a fonctionné assez bien. Une chose étrange, il peut donner la valeur null pour un nombre, et ni isnull ou coalesce sur le compte (DateColumn) le changera à 0. Mais je devrais pouvoir fixer cela au niveau de l'application. – Caimbul

+0

Ah! attends .. j'ai compris. Je l'ai mis dans la jointure interne gauche au lieu de dans la requête de sélection externe .. Première fois en utilisant cte .. De toute façon thx! (a pris une requête qui était d'environ 3min à 3s ..) – Caimbul

+0

@Caimbul J'ai mis à jour sélectionner une partie de la réponse, c'est ce que vous vouliez dire? 3 minutes à 3 secondes sonne bien. – artm