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.