2016-07-31 19 views
2

Ich habe Daten im Datetime-Format gespeichert, d. H. 2016-01-20 03:00:11.000.GROUP BY und ORDER BY Datum als Monat

Mein Ziel ist es, Daten im Monatsformat (String) anzuzeigen und nach Monat zu sortieren.

Was ich will, bekommen (um nach Monaten) -

+----------+-------+ 
| Month | Count | 
+----------+-------+ 
| January | 87 | 
| February | 64 | 
| March | 48 | 
| April | 67 | 
| May  | 49 | 
+----------+-------+ 
... rest of months 

Was erhalte ich (Bestellen von Alphabeten nicht Monate) -

+-----------+-------+ 
| Month | Count | 
+-----------+-------+ 
| April  | 87 | 
| August | 64 | 
| December | 48 | 
| February | 67 | 
| January | 49 | 
| July  | 41 | 
| June  | 44 | 
| March  | 71 | 
| May  | 62 | 
| November | 51 | 
| October | 44 | 
| September | 48 | 
+-----------+-------+ 

Mein Versuch -

SELECT DATENAME(MONTH,[mydate]) as Month, count([ID]) AS Count 
    FROM [dbo].[mytable] 
    group by DATENAME(MONTH,[mydate]) 

Attempt (nicht in Betrieb), um zu bestellen - wegen der Aggregatfunktion

SELECT DATENAME(MONTH,[mydate]) as Month, count([mydate]) AS Count 
    FROM [dbo].[mytable] 
    group by DATENAME(MONTH,[mydate]) 
    ORDER BY MONTH([mydate]) 

Erhalten dieses Fehlers verwendete unsachgemäß

es ist nicht in einer Aggregatfunktion oder die GROUP BY-Klausel enthalten.

Ich bin mir nicht sicher, wie in einem solchen Szenario zu verfahren ist. Jede Hilfe wird geschätzt.

Antwort

3

Sie müssen auch durch die Monatszahl zur Gruppe:

SELECT DATENAME(MONTH,[mydate]) as Month, 
     count([mydate]) AS DateCount 
FROM  [dbo].[mytable] 
GROUP BY MONTH([mydate]), 
     DATENAME(MONTH,[mydate]) 
ORDER BY MONTH([mydate]) 

NB: Don Nenne deinen Count Count nicht, da es ein reserviertes Wort ist. Verwenden Sie DateCount oder etwas anderes.

+0

Ihre Abfrage funktioniert gut, aber wenn ich versuche, Monat und DateCount mit Unterabfrage zu wählen, bekomme ich diesen Fehler - Die ORDER BY-Klausel ist ungültig in Ansichten, Inline-Funktionen, abgeleiteten Tabellen, Unterabfragen und allgemeinen Tabellenausdrücken , es sei denn, TOP, OFFSET oder FOR XML wird ebenfalls angegeben. –

+0

Es ist nicht erforderlich, sie in die Auswahlliste aufzunehmen. Die "Gruppe von" und "Ordnung von" wäre ausreichend. –

+0

@MartinSmith ist richtig, keine Notwendigkeit, die Monatszahl in der SELECT-Klausel zu haben, wichtig ist, es in der Gruppenklausel zu haben. Ich habe meine Antwort aktualisiert. – trincot

0
ORDER BY 
CASE DATENAME(MONTH,[mydate]) 
    WHEN 'January' THEN 0 
    WHEN 'February' THEN 1 
    WHEN 'March' THEN 2 
    WHEN 'April' THEN 3 
    WHEN 'May' THEN 4 
    WHEN 'June' THEN 5 
    WHEN 'July' THEN 6 
    WHEN 'August' THEN 7 
    WHEN 'September' THEN 8 
    WHEN 'October' THEN 9 
    WHEN 'November' THEN 10 
    ELSE 11 
END 
+1

'MONTH()' gibt eine Ganzzahl zurück, die perfekt zur Sortierung geeignet ist. Es gibt absolut keine Notwendigkeit, alle Monate als Strings so aufzulisten. –

+0

Ich bin mir nicht sicher, ob dies die ideale Antwort ist, aber es hat für mich funktioniert. Vielen Dank ! –

+0

@MartinSmith month() holt den Monat im String-Format, aber nicht gut mit ORDER BY. –

0

Eine Möglichkeit, dies zu tun ist mit Fensterfunktionen und Unterabfragen, etwa so:

select Month, Count 
from 
(
    SELECT ROW_NUMBER() OVER (order by MONTH([mydate])) as MonthNumber 
    , DATENAME(MONTH,[mydate]) 
    , count([mydate]) AS Count 
     FROM [dbo].[mytable] 
     group by DATENAME(MONTH,[mydate]) 
) results 
ORDER BY results.MonthNumber 
+0

Ermitteln dieses Fehlers - Die ORDER BY-Klausel ist in Sichten, Inline-Funktionen, abgeleiteten Tabellen, Unterabfragen und allgemeinen Tabellenausdrücken ungültig, es sei denn, TOP, OFFSET oder FOR XML werden ebenfalls angegeben. –

+0

@PirateX diese Bearbeitung sollte es beheben – iliketocode

1

Wenn Sie Daten von einem Jahr haben, dann können Sie tun:

SELECT DATENAME(MONTH, [mydate]) as Month, count([ID]) AS Count 
FROM [dbo].[mytable] 
GROUP BY DATENAME(MONTH, [mydate]) 
ORDER BY MIN(mydate); 

Hinweis: Wie gut das funktioniert, hängt von Ihren Daten. Trincot's Antwort ist spezifischer nach der Monatsnummer zu sortieren. Dies ordnet sich nach den Daten an.