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

So gruppieren Sie nach Jahr in 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
  EXTRACT(year FROM transaction_date) AS year,
  SUM(money) AS money_earned
FROM data
GROUP BY EXTRACT(year FROM 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,
  EXTRACT(year FROM transaction_date) AS year,
  SUM(money) OVER(PARTITION BY EXTRACT(year FROM 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 das year nicht haben Säule. Stattdessen haben Sie die Spalte mit vollständigen Daten.

Zuerst müssen Sie ein Jahr aus dem Datum abrufen. Sie können den EXTRACT(part FROM date) verwenden Funktion dazu. In Ihrem Fall möchten Sie das Jahr extrahieren, also den part ist year . Das date ist die Spalte, die die Daten enthält – das transaction_date Säule. Es ist eine gute Idee, die Spalte danach in Jahr umzubenennen. Wenn Sie mehr über den EXTRACT erfahren möchten Funktion und wie Sie verschiedene Teile des Datums abrufen können, finden Sie hier.

Wenn Sie nur das Jahr und den in diesem Jahr verdienten Gesamtbetrag anzeigen möchten, können Sie 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 EXTRACT(year FROM transaction_date) oder, einfacher, GROUP BY 1 (since EXTRACT(year FROM transaction_date) ist die erste Spalte.)

Wenn Sie mehr Spalten anzeigen möchten, benötigen Sie eine Fensterfunktion (Lösung 2). Nach SUM(money) du schreibst den OVER() -Klausel und, da Sie die Summe für jedes Jahr berechnen möchten, verwenden Sie PARTITION BY EXTRACT(year FROM transaction_date) im Inneren. Beachten Sie, dass Sie bei der Berechnung der Summe noch keine Jahresspalte haben, also PARTITION BY year wird nicht funktionieren – Sie würden einen Fehler erhalten 'column "year" does not exist' . Mehr über die Fensterfunktionen erfahren Sie in diesem Artikel.

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 das Jahr und das in diesem Jahr verdiente Gesamtgeld anzeigen möchten, genügt ein einfacher GROUP BY reicht. Wenn Sie sich mit dem Konzept von GROUP BY nicht wohl fühlen , schau mal 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.

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 (hier:SUM(money)) verwenden ) 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.