SQL-Gruppierung nach Monat und Jahr

72

Ich bin nicht sicher, was ich in die folgende SQL-Abfrage schreiben soll, um die Spalte 'Datum' wie folgt anzuzeigen: "Monat-Jahr" - "9-2011".

SELECT MONTH(date) + '.' + YEAR(date) AS Mjesec, SUM(marketingExpense) AS SumaMarketing, SUM(revenue) AS SumaZarada 
FROM [Order]
WHERE (idCustomer = 1) AND (date BETWEEN '2001-11-3' AND '2011-11-3')
GROUP BY MONTH(date), YEAR(date)

Ich möchte also die Daten aus der ersten Spalte so ändern, dass Monat und Jahr angezeigt werden, anstatt nur den Monat anzuzeigen.

wegelagerer
quelle
Diese Frage ist etwas verwirrend - versuchen Sie, nach Datum zu sortieren?
Chris Cashwell
Ich verstehe das nicht: "Ich möchte die erste Spalte anzeigen, da ich die erste Spalte anders formatieren möchte, damit sie eindeutig ist."
Stefan Steinegger
@JNK - Microsoft SQL @Chris - Nein, ich versuche nicht, nach Datum zu sortieren. Ich möchte nur die Ergebnisse aus der ersten Spalte so ändern, dass Monat und Jahr angezeigt werden, anstatt nur Monat.
Wegelagerer
1
Müssen Sie nicht zuerst nach Jahr, dann nach Monat gruppieren? Und können Sie bitte eine Beispielausgabe zeigen?
Benutzer unbekannt

Antworten:

163
SELECT CAST(MONTH(date) AS VARCHAR(2)) + '-' + CAST(YEAR(date) AS VARCHAR(4)) AS Mjesec, SUM(marketingExpense) AS SumaMarketing, SUM(revenue) AS SumaZarada 
FROM [Order]
WHERE (idCustomer = 1) AND (date BETWEEN '2001-11-3' AND '2011-11-3')
GROUP BY CAST(MONTH(date) AS VARCHAR(2)) + '-' + CAST(YEAR(date) AS VARCHAR(4))

Oder wie bei @ 40-Love erwähnt, können Sie mit führenden Nullen wirken:

GROUP BY 
  CAST(YEAR(date) AS VARCHAR(4)) + '-' + right('00' + CAST(MONTH(date) AS VARCHAR(2)), 2) 
Lamak
quelle
Mit dieser Methode ist es nutzlos, nach Datum zu sortieren
madd
14

Ich denke, es ist MS SQL, da es wie MS SQL-Syntax aussieht.

Sie sollten also dasselbe in die Gruppenzeile einfügen wie in select ex:

Select MONTH(date)+'-'+YEAR(date), ....
...
...
...
group by MONTH(date)+'-'+YEAR(date)
Dumitrescu Bogdan
quelle
2
MONTH(date)gibt ein zurück int. Es wird etwas brauchen cast.
Martin Smith
true .. sollte als varchar gegossen werden, obwohl mein Punkt die Tatsache war, dass Sie alles in die Auswahl einfügen können, solange das gleiche im Gruppenteil ist. Theoretisch ist die select-Anweisung aus SQL-Sicht gültig.
Dumitrescu Bogdan
Nein, in MS SQL wird keine Zeichenfolge zurückgegeben, aber ich habe dies aus Demonstrationsgründen für die Gruppierung geschrieben.
Dumitrescu Bogdan
6

Wenn ich richtig verstehe. Um Ihre Ergebnisse wie gewünscht zu gruppieren, muss Ihre Group By-Klausel denselben Ausdruck wie Ihre select-Anweisung haben.

GROUP BY MONTH(date) + '.' + YEAR(date)

Um das Datum als "Monat-Datum" -Format anzuzeigen, ändern Sie das '.' zu '-' Die vollständige Syntax wäre ungefähr so.

SELECT MONTH(date) + '-' + YEAR(date) AS Mjesec, SUM(marketingExpense) AS
SumaMarketing, SUM(revenue) AS SumaZarada 
FROM [Order]
WHERE (idCustomer = 1) AND (date BETWEEN '2001-11-3' AND '2011-11-3')
GROUP BY MONTH(date) + '.' + YEAR(date)
Eupton
quelle
2
Vermutlich haben Sie nie versucht, diesen Code auszuführen, weil er möglicherweise nicht funktioniert?
NickG
6

SQL Server 2012 oben, ich bevorzuge format () Funktion verwenden, vereinfachen.

SELECT format(date,'MM.yyyy') AS Mjesec, SUM(marketingExpense) AS SumaMarketing, SUM(revenue) AS SumaZarada 
FROM [Order]
WHERE (idCustomer = 1) AND (date BETWEEN '2001-11-3' AND '2011-11-3')
GROUP BY format(date,'MM.yyyy')
YHTAN
quelle
1
Ich mussteDATE_FORMAT(date, '%m.%Y')
CTS_AE
3

Sie können die Multiplikation versuchen, um Jahr und Monat so anzupassen, dass sie eine Zahl sind. Dies läuft nach meinen Tests viel schneller als format(date,'yyyy.MM'). Ich bevorzuge das Jahr vor dem Monat zum Sortieren. Code erstellt aus MS SQL Server Express Version 12.0.

SELECT (YEAR(Date) * 100) + MONTH(Date) AS yyyyMM
FROM [Order]
...
GROUP BY (YEAR(Date) * 100) + MONTH(Date)
ORDER BY yyyyMM
Erik Mattson
quelle
1
Ich habe das gerade gelesen und wollte den gleichen Kommentar abgeben. Es ist sehr effizient
user1664043
2
Yet another alternative: 

Select FORMAT(date,'MM.yy')
...
...
group by FORMAT(date,'MM.yy')
MelOS
quelle
1

In postgresql kann ich eine ähnliche Abfrage mit einer Datumsformatfunktion (to_char) schreiben und nur nach Datum gruppieren:

SELECT to_char (datum, 'MM-YYYY') AS mjesec 
FROM test 
GROUP BY datum 
ORDER BY datum;

So etwas ist sicherlich auch mit SQL-Server möglich, nicht wahr?

Benutzer unbekannt
quelle
-6

Wenn Sie das Feld weiterhin im Datentyp datetime behalten möchten, versuchen Sie Folgendes:

SELECT DATEADD(MONTH, DATEDIFF(MONTH, 0, o.[date]), 0) AS Mjesec, SUM(marketingExpense) AS SumaMarketing, SUM(revenue) AS SumaZarada 
FROM [Order] o
WHERE (idCustomer = 1) AND (o.[date] BETWEEN '2001-11-3' AND '2011-11-3')
GROUP BY DATEADD(MONTH, DATEDIFF(MONTH, 0, o.[date]), 0)

Es ist auch einfach, nach Stunden, Tagen, Wochen, Jahren in Gruppen zu wechseln ...
Ich hoffe, es ist für jemanden von Nutzen,

Grüße!

IUmpierrez
quelle
Ihre Aussage öffnet 3 Klammern und schließt 1 und datiertiff erfordert 3 Argumente. Das kann nicht funktionieren.
Gus27