Problém:
Chcete seskupit data podle roku.
Příklad I:
Jeden ze sloupců ve vašich datech je transaction_date
. Obsahuje datum. Chtěli byste seskupit všechna svá data podle roku a vypočítat celkové peníze vydělané každý rok.
data
tabulka vypadá takto:
transaction_date | peníze |
---|---|
25.03.2018 | 1700 |
2019-09-12 | 100 |
2018-07-14 | 1200 |
2018-01-05 | 400 |
2019-06-08 | 2000 |
2020-03-06 | 1500 |
Řešení 1 (zobrazení roku a vydělaných peněz):
SELECT YEAR(transaction_date) AS year, SUM(money) AS money_earned FROM data GROUP BY YEAR(transaction_date);
Výsledek je:
rok | peníze_vydělané |
---|---|
2020 | 1500 |
2019 | 2100 |
2018 | 3300 |
Řešení 2 (zobrazení úplného data, roku a peněz vydělaných v odpovídajícím roce):
SELECT transaction_date AS transaction_date, YEAR(transaction_date) AS year, SUM(money) OVER(PARTITION BY YEAR(transaction_date)) AS money_earned FROM data;
Výsledek je:
transaction_date | rok | peníze_vydělané |
---|---|---|
25.03.2018 | 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 |
Diskuse:
V tomto příkladu se předpokládá, že nemáte sloupec rok. Máte sloupec s úplnými daty a chtěli byste z něj získat rok.
Chcete-li načíst rok od data na serveru SQL Server, můžete použít YEAR()
funkce. Argumentem této funkce by mělo být datum – zde transaction_date
sloupec.
Pokud chcete zobrazit rok a celkové peníze vydělané v tomto roce, můžete použít GROUP BY
. První vybraný sloupec je rok extrahovaný z data. Druhý sloupec je agregační funkce SUM(money)
. Na konci dotazu potřebujete GROUP BY
YEAR(transaction_date)
. Proto Řešení 1.
Pokud chcete zobrazit více sloupců, použijte funkci okna (řešení 2). Po SUM(money)
napíšete OVER()
klauzuli, a protože chcete seskupit podle každého roku, použijte PARTITION BY YEAR(transaction_date)
uvnitř toho. Všimněte si, že ještě nemáte year
sloupec při počítání součtu, takže PARTITION BY
rok nebude fungovat. Více o funkcích okna si můžete přečíst zde.
Příklad II:
Jeden ze sloupců ve vašich údajích je year
. Chtěli byste seskupit všechna svá data do tohoto sloupce a vypočítat celkové peníze vydělané každý rok.
data
tabulka vypadá takto:
rok | měsíc | den | peníze |
---|---|---|---|
2018 | 3 | 25 | 1700 |
2019 | 9 | 12 | 100 |
2018 | 7 | 14 | 1200 |
2018 | 1 | 5 | 400 |
2019 | 6 | 8 | 2000 |
2020 | 3 | 6 | 1500 |
Řešení 1 (zobrazení roku a vydělaných peněz):
SELECT year, SUM(money) AS money_earned FROM data GROUP BY year;
Výsledek je:
rok | peníze_vydělané |
---|---|
2020 | 1500 |
2018 | 3300 |
2019 | 2100 |
Řešení 2 (zobrazení roku, měsíce, dne a peněz vydělaných v odpovídajícím roce):
SELECT year, month, day, SUM(money) OVER(PARTITION BY year) AS money_earned FROM data;
Výsledek je:
rok | měsíc | den | peníze_vydělané |
---|---|---|---|
2018 | 3 | 25 | 3300 |
2018 | 7 | 14 | 3300 |
2018 | 1 | 5 | 3300 |
2019 | 9 | 12 | 2100 |
2019 | 6 | 8 | 2100 |
2020 | 3 | 6 | 1500 |
Diskuse
V tomto příkladu se předpokládá, že již máte year
sloupec.
Pokud chcete zobrazit pouze rok a celkové peníze vydělané v tomto roce, jednoduchý GROUP BY
stačí. Pokud se necítíte dobře s konceptem GROUP BY, podívejte se sem, kde jej vysvětlujeme. Jednoduše použijete agregační funkci (zde:SUM
) se správným sloupcem a na konci dotazu seskupte podle year
. Sloupec můžete přejmenovat pomocí AS
klíčové slovo s novým názvem. Také, pokud chcete mít data seřazená podle roku, použijte ORDER BY
rok na konci vašeho dotazu.
Je to složitější, pokud byste chtěli zobrazit i některé další sloupce. Pak potřebujete řešení pomocí funkce okna (Řešení 2). Měli byste použít agregační funkci s příslušným sloupcem (SUM(money)
) a napište OVER()
doložka následně. V tomto článku byste měli použít PARTITION BY
se sloupcem, podle kterého chcete seskupit. Takto získáte:
SUM(money) OVER(PARTITION BY year)
V tomto řešení nepoužíváte GROUP BY
doložka.
Více o funkcích okna si můžete přečíst zde.