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 YEAR(transaction_date) AS year, SUM(money) AS money_earned FROM data GROUP BY YEAR(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, YEAR(transaction_date) AS year, SUM(money) OVER(PARTITION BY YEAR(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 kolonnen år. Du har kolonnen med fuldstændige datoer og vil gerne hente året fra den.
For at hente et år fra datoen i SQL Server, kan du bruge YEAR()
fungere. Argumentet for denne funktion skal være en dato – her transaction_date
kolonne.
Hvis du gerne vil vise året og de samlede penge tjent i å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
YEAR(transaction_date)
. Derfor Løsning 1.
Hvis du gerne vil have vist flere kolonner, bruger du en vinduesfunktion (løsning 2). Efter SUM(money)
du skriver OVER()
klausul, og da du gerne vil gruppere efter hvert år, skal du bruge PARTITION BY YEAR(transaction_date)
inde i den. Bemærk, at du endnu ikke har year
kolonne, når summen tælles, så PARTITION BY
år virker ikke. Du kan læse mere om vinduesfunktionerne her.
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 kun 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, så 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. Hvis du gerne vil have data sorteret efter år, skal du også bruge ORDER BY
år i slutningen af din forespørgsel.
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 (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.