2012-03-27 6 views
19

I mit insgesamt keinen von 1000 Datensätze in it.It eine Tabelle haben die folgende Struktur:Anzahl Datensätze für jeden Monat in einem Jahr

EMP_ID EMP_NAME PHONE_NO ARR_DATE 
1  A  545454 2012/03/12 

Ich mag für jeden Monat im Jahres- keine Datensätze berechnen 2012

Gibt es irgendeine Möglichkeit, die mein Problem in einem einzigen Schuss lösen sollte?

Ich habe versucht:

select count(*) 
from table_emp 
where year(ARR_DATE) = '2012' and month(ARR_DATE) = '01' 
+1

es scheint keine Frage zu sein? –

+1

siehe von ..... Ich möchte (2. Zeile) von oben für Frage –

+1

BTW Wrapping Spalten in Funktionen macht die Abfrage nicht nutzbar. –

Antwort

55
SELECT COUNT(*) 
FROM  table_emp 
WHERE  YEAR(ARR_DATE) = '2012' 
GROUP BY MONTH(ARR_DATE) 
+0

warum Zitate um 2012? 'YEAR()' gibt eine Zahl AFAIK zurück. –

+1

@iDevlop Ich habe es gerade getestet ('Microsoft SQL Server 2012 - 11.0.5058.0 (X64)') und es funktioniert sowohl mit als auch ohne die Anführungszeichen. – Dan

+0

** zB: - Im April ist kein Mitarbeiter registriert. ** Der Monat hat also 0 Zähler.wie dieser Datensatz zum Endergebnis beiträgt. –

2
select count(*) 
from table_emp 
where DATEPART(YEAR, ARR_DATE) = '2012' AND DATEPART(MONTH, ARR_DATE) = '01' 
+0

Ihre Abfrage und meine Abfrage-Ausgabe ist gleich. Ich möchte einen Weg, so dass ich Daten Monat weise bekommen kann ..! –

11

Diese Abfrage:

SELECT 
    SUM(CASE datepart(month,ARR_DATE) WHEN 1 THEN 1 ELSE 0 END) AS 'January', 
    SUM(CASE datepart(month,ARR_DATE) WHEN 2 THEN 1 ELSE 0 END) AS 'February', 
    SUM(CASE datepart(month,ARR_DATE) WHEN 3 THEN 1 ELSE 0 END) AS 'March', 
    SUM(CASE datepart(month,ARR_DATE) WHEN 4 THEN 1 ELSE 0 END) AS 'April', 
    SUM(CASE datepart(month,ARR_DATE) WHEN 5 THEN 1 ELSE 0 END) AS 'May', 
    SUM(CASE datepart(month,ARR_DATE) WHEN 6 THEN 1 ELSE 0 END) AS 'June', 
    SUM(CASE datepart(month,ARR_DATE) WHEN 7 THEN 1 ELSE 0 END) AS 'July', 
    SUM(CASE datepart(month,ARR_DATE) WHEN 8 THEN 1 ELSE 0 END) AS 'August', 
    SUM(CASE datepart(month,ARR_DATE) WHEN 9 THEN 1 ELSE 0 END) AS 'September', 
    SUM(CASE datepart(month,ARR_DATE) WHEN 10 THEN 1 ELSE 0 END) AS 'October', 
    SUM(CASE datepart(month,ARR_DATE) WHEN 11 THEN 1 ELSE 0 END) AS 'November', 
    SUM(CASE datepart(month,ARR_DATE) WHEN 12 THEN 1 ELSE 0 END) AS 'December', 
    SUM(CASE datepart(year,ARR_DATE) WHEN 2012 THEN 1 ELSE 0 END) AS 'TOTAL' 
FROM 
    sometable 
WHERE 
    ARR_DATE BETWEEN '2012/01/01' AND '2012/12/31' 
+1

+1 für die Vermeidung unsargable Prädikat, sollte aber eindeutige Datumsformate verwenden und das OP sollte 'BETWEEN' vermeiden, wenn 'datetime' Datentyp (OK wenn' Datum' Datentyp) –

+0

Angenommen es ist Datumstyp, da es keine "Zeit" in Beispiel gibt Daten – cichy

+0

Es wird die Gesamtzahl der Datensätze von Januar bis Dezember angezeigt. Monatlich oder nicht ..? –

32

Dies gibt Ihnen die Zählung pro Monat für das Jahr 2012;

SELECT MONTH(ARR_DATE) MONTH, COUNT(*) COUNT 
FROM table_emp 
WHERE YEAR(arr_date)=2012 
GROUP BY MONTH(ARR_DATE); 

Demo here.

+2

Ich bevorzuge dies, da es die Monatsnummer auch gibt – AdRock

+0

Kann ich Monatsnamen anstelle der Nummer bekommen? Beispiel 'Jan',' Feb' –

+0

Verwenden Sie 'SELECT MONTHNAME (ARR_DATE) MONTH', um "Januar", "Februar" usw. zu erhalten. – chrish