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.