sql >> Databasteknik >  >> RDS >> Database

Hur man grupperar efter år i SQL

Problem:

Du vill gruppera dina data efter år.

Exempel I:

En av kolumnerna i din data är transaction_date . Den innehåller ett datum. Du skulle vilja gruppera all din data efter år och beräkna den totala summan som tjänats in varje år.

data tabellen ser ut så här:

transaction_date pengar
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ösning 1 (visar år och intjänade pengar):

SELECT
  EXTRACT(year FROM transaction_date) AS year,
  SUM(money) AS money_earned
FROM data
GROUP BY EXTRACT(year FROM transaction_date);

Resultatet är:

år pengar_intjänade
2020 1500
2019 2100
2018 3300

Lösning 2 (visar hela datumet, året och pengarna som tjänats in under motsvarande år):

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;

Resultatet är:

transaction_date år pengar_intjänade
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:

I det här exemplet antas det att du inte har year kolumn. Istället har du kolumnen med fullständiga datum.

Först måste du hämta ett år från datumet. Du kan använda EXTRACT(part FROM date) funktion för att göra det. I ditt fall vill du extrahera årtalet, så part är year . date är kolumnen som innehåller datumen – transaction_date kolumn. Det är en bra idé att byta namn på kolumnen till år efteråt. Om du vill lära dig mer om EXTRACT funktion och hur man hämtar olika delar från datumet, hittar du det här.

Om du bara vill visa året och de totala intjänade pengarna under det här året kan du använda en GROUP BY . Den första valda kolumnen är det årtal som extraheras från datumet. Den andra kolumnen är aggregatfunktionen SUM(money) . I slutet av frågan behöver du en GROUP BY EXTRACT(year FROM transaction_date) eller, enklare, GROUP BY 1 (since EXTRACT(year FROM transaction_date) är den första kolumnen.)

Om du vill visa fler kolumner behöver du en fönsterfunktion (lösning 2). Efter SUM(money) du skriver OVER() och, eftersom du vill beräkna summan för varje år, använd PARTITION BY EXTRACT(year FROM transaction_date) innuti. Observera att du ännu inte har kolumnen år när du beräknar summan, så PARTITION BY year kommer inte att fungera – du skulle få ett felmeddelande 'column "year" does not exist' . Du kan läsa mer om fönsterfunktionerna i den här artikeln.

Exempel II:

En av kolumnerna i din data är year . Du skulle vilja gruppera all din data i den här kolumnen och beräkna den totala summan som tjänas in varje år.

data tabellen ser ut så här:

år månad dag pengar
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ösning 1 (visar år och intjänade pengar):

SELECT
  year,
  SUM(money) AS money_earned
FROM data
GROUP BY year;

Resultatet är:

år pengar_intjänade
2020 1500
2018 3300
2019 2100

Lösning 2 (visar år, månad, dag och pengarna som tjänats in under motsvarande år):

SELECT
  year,
  month,
  day,
  SUM(money) OVER(PARTITION BY year) AS money_earned
FROM data;

Resultatet är:

år månad dag pengar_intjänade
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:

I det här exemplet antas det att du redan har year kolumn.

Om du vill visa året och de totala intjänade pengarna under detta år, en enkel GROUP BY är nog. Om du inte känner dig bekväm med konceptet GROUP BY , ta en titt här där vi förklarar det. Du använder helt enkelt aggregatfunktionen (här:SUM ) med rätt kolumn och i slutet av frågan grupperar du efter year . Du kan byta namn på kolumnen med AS nyckelord med ett nytt namn.

Det är mer komplicerat om du också vill visa några andra kolumner. Då behöver du lösningen med hjälp av en fönsterfunktion (lösning 2). Du bör använda aggregatfunktionen med lämplig kolumn (här:SUM(money) ) och skriv OVER() klausul efteråt. I den här klausulen ska du använda PARTITION BY med kolumnen som du vill gruppera efter. Så får du:

SUM(money) OVER(PARTITION BY year)

I den här lösningen använder du inte en GROUP BY klausul.

Du kan läsa mer om fönsterfunktionerna här.


  1. lagra långa värden i Android-databasen

  2. Livförsäkringsdatamodell

  3. ta bort SQLite-databas när du uppdaterar ny version av programmet

  4. Kombinera två tabeller till en ny så att valda rader från den andra ignoreras