Database
 sql >> Datenbank >  >> RDS >> Database

So gruppieren Sie nach Jahr in T-SQL

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.