Problem:
Sie möchten Ihre Daten nach Jahr gruppieren.
Beispiel I:
Eine der Spalten in Ihren Daten ist transaction_date
. Es enthält ein Datum. Sie möchten alle Ihre Daten nach Jahr gruppieren und die Gesamteinnahmen pro Jahr berechnen.
Die data
Tabelle sieht so aus:
transaction_date | Geld |
---|---|
2018-03-25 | 1700 |
2019-09-12 | 100 |
2018-07-14 | 1200 |
2018-01-05 | 400 |
2019-06-08 | 2000 |
2020-03-06 | 1500 |
Lösung 1 (Anzeige des Jahres und des verdienten Geldes):
SELECT YEAR(transaction_date) AS year, SUM(money) AS money_earned FROM data GROUP BY YEAR(transaction_date);
Das Ergebnis ist:
Jahr | Geld_verdient |
---|---|
2020 | 1500 |
2019 | 2100 |
2018 | 3300 |
Lösung 2 (Anzeige des vollständigen Datums, des Jahres und des im entsprechenden Jahr verdienten Geldes):
SELECT transaction_date AS transaction_date, YEAR(transaction_date) AS year, SUM(money) OVER(PARTITION BY YEAR(transaction_date)) AS money_earned FROM data;
Das Ergebnis ist:
transaction_date | Jahr | Geld_verdient |
---|---|---|
2018-03-25 | 2018 | 3300 |
2018-07-14 | 2018 | 3300 |
2018-01-05 | 2018 | 3300 |
2019-09-12 | 2019 | 2100 |
2019-06-08 | 2019 | 2100 |
2020-03-06 | 2020 | 1500 |
Diskussion:
In diesem Beispiel wird davon ausgegangen, dass Sie die Jahresspalte nicht haben. Sie haben die Spalte mit vollständigen Daten und möchten daraus das Jahr abrufen.
Um ein Jahr aus dem Datum in SQL Server abzurufen, können Sie YEAR()
verwenden Funktion. Das Argument dieser Funktion sollte ein Datum sein – hier das transaction_date
Spalte.
Wenn Sie das Jahr und das in diesem Jahr verdiente Gesamtgeld anzeigen möchten, können Sie ein GROUP BY
verwenden . Die erste ausgewählte Spalte ist das aus dem Datum extrahierte Jahr. Die zweite Spalte ist die Aggregatfunktion SUM(money)
. Am Ende der Abfrage benötigen Sie ein GROUP BY
YEAR(transaction_date)
. Daher Lösung 1.
Wenn Sie mehr Spalten anzeigen möchten, verwenden Sie eine Fensterfunktion (Lösung 2). Nach SUM(money)
du schreibst den OVER()
-Klausel und, da Sie nach jedem Jahr gruppieren möchten, verwenden Sie PARTITION BY YEAR(transaction_date)
im Inneren. Beachten Sie, dass Sie das year
noch nicht haben Spalte beim Zählen der Summe, also PARTITION BY
Jahr geht nicht. Hier können Sie mehr über die Fensterfunktionen lesen.
Beispiel II:
Eine der Spalten in Ihren Daten ist year
. Sie möchten alle Ihre Daten nach dieser Spalte gruppieren und die Gesamteinnahmen pro Jahr berechnen.
Die data
Tabelle sieht so aus:
Jahr | Monat | Tag | Geld |
---|---|---|---|
2018 | 3 | 25 | 1700 |
2019 | 9 | 12 | 100 |
2018 | 7 | 14 | 1200 |
2018 | 1 | 5 | 400 |
2019 | 6 | 8 | 2000 |
2020 | 3 | 6 | 1500 |
Lösung 1 (Anzeige des Jahres und des verdienten Geldes):
SELECT year, SUM(money) AS money_earned FROM data GROUP BY year;
Das Ergebnis ist:
Jahr | Geld_verdient |
---|---|
2020 | 1500 |
2018 | 3300 |
2019 | 2100 |
Lösung 2 (Anzeige von Jahr, Monat, Tag und dem im entsprechenden Jahr verdienten Geld):
SELECT year, month, day, SUM(money) OVER(PARTITION BY year) AS money_earned FROM data;
Das Ergebnis ist:
Jahr | Monat | Tag | Geld_verdient |
---|---|---|---|
2018 | 3 | 25 | 3300 |
2018 | 7 | 14 | 3300 |
2018 | 1 | 5 | 3300 |
2019 | 9 | 12 | 2100 |
2019 | 6 | 8 | 2100 |
2020 | 3 | 6 | 1500 |
Diskussion
In diesem Beispiel wird davon ausgegangen, dass Sie das year
bereits haben Spalte.
Wenn Sie nur das Jahr und das in diesem Jahr verdiente Gesamtgeld anzeigen möchten, genügt ein einfaches GROUP BY
reicht. Wenn Sie sich mit dem Konzept von GROUP BY nicht wohl fühlen, schauen Sie hier, wo wir es erklären. Sie verwenden einfach die Aggregatfunktion (hier:SUM
) mit der richtigen Spalte und gruppieren Sie am Ende der Abfrage nach year
. Sie können die Spalte mit dem AS
umbenennen Stichwort mit neuem Namen. Wenn Sie die Daten auch nach Jahr sortiert haben möchten, verwenden Sie ORDER BY
Jahr am Ende Ihrer Anfrage.
Komplizierter wird es, wenn Sie noch einige andere Spalten anzeigen möchten. Dann benötigen Sie die Lösung mit einer Fensterfunktion (Lösung 2). Sie sollten die Aggregatfunktion mit der entsprechenden Spalte verwenden (SUM(money)
) und schreiben Sie den OVER()
Klausel danach. In dieser Klausel sollten Sie PARTITION BY
verwenden mit der Spalte, nach der Sie gruppieren möchten. So erhalten Sie:
SUM(money) OVER(PARTITION BY year)
In dieser Lösung verwenden Sie kein GROUP BY
Klausel.
Hier können Sie mehr über die Fensterfunktionen lesen.