sql >> Database teknologi >  >> RDS >> Database

Sådan grupperes efter år i SQL

Problem:

Du vil gruppere dine data efter år.

Eksempel I:

En af kolonnerne i dine data er transaction_date . Den indeholder en dato. Du vil gerne gruppere alle dine data efter år og beregne de samlede penge, der er tjent hvert år.

data tabellen ser sådan ud:

transaktionsdato penge
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 (viser året og de tjente penge):

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

Resultatet er:

år penge_tjent
2020 1500
2019 2100
2018 3300

Løsning 2 (viser den fulde dato, året og pengene tjent i det tilsvarende å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 er:

transaktionsdato år penge_tjent
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 dette eksempel antages det, at du ikke har year kolonne. I stedet har du kolonnen med fuldstændige datoer.

Først skal du hente et år fra datoen. Du kan bruge EXTRACT(part FROM date) funktion til at gøre det. I dit tilfælde vil du gerne udtrække året, så part er year . date er den kolonne, der indeholder datoerne – transaction_date kolonne. Det er en god idé at omdøbe kolonnen til år bagefter. Hvis du vil lære mere om EXTRACT funktion og hvordan man henter forskellige dele fra datoen, kan du finde det her.

Hvis du kun vil vise året og de samlede penge tjent i dette år, kan du bruge en GROUP BY . Den første valgte kolonne er året udtrukket fra datoen. Den anden kolonne er den samlede funktion SUM(money) . I slutningen af ​​forespørgslen skal du bruge en GROUP BY EXTRACT(year FROM transaction_date) eller, enklere, GROUP BY 1 (since EXTRACT(year FROM transaction_date) er den første kolonne.)

Hvis du gerne vil have vist flere kolonner, skal du bruge en vinduesfunktion (løsning 2). Efter SUM(money) du skriver OVER() og, da du gerne vil beregne summen for hvert år, skal du bruge PARTITION BY EXTRACT(year FROM transaction_date) inde i den. Bemærk, at du endnu ikke har kolonnen år, når du beregner summen, så PARTITION BY year vil ikke virke – du får fejlen 'column "year" does not exist' . Du kan læse mere om vinduesfunktionerne i denne artikel.

Eksempel II:

En af kolonnerne i dine data er year . Du vil gerne gruppere alle dine data efter denne kolonne og beregne de samlede penge, der er tjent hvert år.

data tabellen ser sådan ud:

år måned dag penge
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 (viser året og de tjente penge):

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

Resultatet er:

år penge_tjent
2020 1500
2018 3300
2019 2100

Løsning 2 (viser år, måned, dag og pengene tjent i det tilsvarende år):

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

Resultatet er:

år måned dag penge_tjent
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 dette eksempel antages det, at du allerede har year kolonne.

Hvis du gerne vil vise året og de samlede penge, der er tjent i dette år, skal du bruge en simpel GROUP BY er nok. Hvis du ikke føler dig tryg ved konceptet GROUP BY , tag et kig her, hvor vi forklarer det. Du bruger blot aggregatfunktionen (her:SUM ) med den korrekte kolonne og i slutningen af ​​forespørgslen grupperer du efter year . Du kan omdøbe kolonnen ved at bruge AS søgeord med et nyt navn.

Det er mere kompliceret, hvis du også gerne vil vise nogle andre kolonner. Så skal du bruge løsningen ved hjælp af en vinduesfunktion (løsning 2). Du skal bruge aggregatfunktionen med den relevante kolonne (her:SUM(money) ) og skriv OVER() klausul bagefter. I denne klausul skal du bruge PARTITION BY med den kolonne, som du vil gruppere efter. Sådan får du:

SUM(money) OVER(PARTITION BY year)

I denne løsning bruger du ikke en GROUP BY klausul.

Du kan læse mere om vinduesfunktionerne her.


  1. Kan ikke forhindre SQLiteConnection-objektlækage

  2. Sådan bruger du Linked Table Manager i Access 2016

  3. Hvordan kan jeg dræbe alle sessioner, der forbinder til min oracle-database?

  4. Bedste praksis:.NET:Hvordan returnerer jeg PK mod en oracle-database?