2016-06-17 13 views
0

So war die ursprüngliche Abfrage recht einfach.SQL-Abfrage, um die Anzahl der monatlichen Zeilen zurückzugeben, ist langsam

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

Aber einer der Monate hatte keine Daten, und ich muss alle 12 Monate abgedeckt haben. Ich bin damit beschäftigt, es zu überarbeiten. Ich habe eine Lösung, aber es ist schmerzhaft langsam. Es muss einen besseren Weg geben.

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 

Antwort

3

Erstellen Sie eine Tabelle mit den 12 Monaten darin und links verbinden mit dem Ergebnis der ersten Abfrage. Etwas wie:

;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

Super! das hat ganz gut geklappt. Eine seltsame Sache, es kann Null für eine Zählung geben, und weder isnull noch coalesce on count (DateColumn) wird es auf 0 setzen. Aber ich sollte das auf App-Ebene beheben können. – Caimbul

+0

Ah! warte .. ich habe es herausgefunden. Ich habe es in den inneren linken Join gesetzt, anstatt in die äußere select Abfrage. Das erste Mal mit cte's. So oder so thx! (nahm eine Abfrage, die etwa 3min bis 3s war ..) – Caimbul

+0

@Caimbul Ich aktualisierte einen Teil der Antwort, ist das, was du meintest? 3 Minuten bis 3 Sekunden klingt gut. – artm