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.
sql
sql-server
wegelagerer
quelle
quelle
Antworten:
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:
quelle
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)
quelle
MONTH(date)
gibt ein zurückint
. Es wird etwas brauchencast
.Wenn ich richtig verstehe. Um Ihre Ergebnisse wie gewünscht zu gruppieren, muss Ihre Group By-Klausel denselben Ausdruck wie Ihre select-Anweisung haben.
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)
quelle
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')
quelle
DATE_FORMAT(date, '%m.%Y')
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
quelle
Yet another alternative: Select FORMAT(date,'MM.yy') ... ... group by FORMAT(date,'MM.yy')
quelle
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?
quelle
Für mariaDB können Sie:
SELECT DATE_FORMAT(date, '%m-%Y') FROM [Order] GROUP BY DATE_FORMAT(date, '%m-%Y')
Link: https://mariadb.com/kb/en/library/date_format/
quelle
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!
quelle