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 YEAR(transaction_date) AS year, SUM(money) AS money_earned FROM data GROUP BY YEAR(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, YEAR(transaction_date) AS year, SUM(money) OVER(PARTITION BY YEAR(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 kolumnen år. Du har kolumnen med fullständiga datum och skulle vilja hämta årtalet från den.
För att hämta ett år från datumet i SQL Server kan du använda YEAR()
fungera. Argumentet för denna funktion bör vara ett datum – här transaction_date
kolumn.
Om du 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
YEAR(transaction_date)
. Därav lösning 1.
Om du vill visa fler kolumner använder du en fönsterfunktion (lösning 2). Efter SUM(money)
du skriver OVER()
och, eftersom du vill gruppera efter varje år, använd PARTITION BY YEAR(transaction_date)
innuti. Observera att du ännu inte har year
kolumn när summan räknas, så PARTITION BY
året kommer inte att fungera. Du kan läsa mer om fönsterfunktionerna här.
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 bara 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. Om du vill ha uppgifterna sorterade efter år, använd ORDER BY
år i slutet av din fråga.
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 (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.