Problem:
Chcesz pogrupować swoje dane według roku.
Przykład I:
Jedna z kolumn w Twoich danych to transaction_date
. Zawiera datę. Chcesz pogrupować wszystkie swoje dane według roku i obliczyć łączne pieniądze zarobione każdego roku.
data
tabela wygląda tak:
data_transakcji | pieniądze |
---|---|
2018-03-25 | 1700 |
2019-09-12 | 100 |
14-07-2018 | 1200 |
2018-01-05 | 400 |
2019-06-08 | 2000 |
2020-03-06 | 1500 |
Rozwiązanie 1 (wyświetlanie roku i zarobionych pieniędzy):
SELECT YEAR(transaction_date) AS year, SUM(money) AS money_earned FROM data GROUP BY YEAR(transaction_date);
Wynik:
rok | pieniądze_zarobione |
---|---|
2020 | 1500 |
2019 | 2100 |
2018 | 3300 |
Rozwiązanie 2 (wyświetlanie pełnej daty, roku i pieniędzy zarobionych w odpowiednim roku):
SELECT transaction_date AS transaction_date, YEAR(transaction_date) AS year, SUM(money) OVER(PARTITION BY YEAR(transaction_date)) AS money_earned FROM data;
Wynik:
data_transakcji | rok | pieniądze_zarobione |
---|---|---|
2018-03-25 | 2018 | 3300 |
14-07-2018 | 2018 | 3300 |
2018-01-05 | 2018 | 3300 |
2019-09-12 | 2019 | 2100 |
2019-06-08 | 2019 | 2100 |
2020-03-06 | 2020 | 1500 |
Dyskusja:
W tym przykładzie założono, że nie masz kolumny roku. Masz kolumnę z pełnymi datami i chcesz pobrać z niej rok.
Aby pobrać rok od daty w SQL Server, możesz użyć YEAR()
funkcjonować. Argumentem tej funkcji powinna być data – tutaj transaction_date
kolumna.
Jeśli chcesz wyświetlić rok i łączne pieniądze zarobione w tym roku, możesz użyć GROUP BY
. Pierwsza wybrana kolumna to rok wyodrębniony z daty. Druga kolumna to funkcja agregująca SUM(money)
. Na końcu zapytania potrzebujesz GROUP BY
YEAR(transaction_date)
. Stąd rozwiązanie 1.
Jeśli chcesz wyświetlić więcej kolumn, użyj funkcji okna (Rozwiązanie 2). Po SUM(money)
piszesz OVER()
i, ponieważ chcesz pogrupować według każdego roku, użyj PARTITION BY YEAR(transaction_date)
w środku tego. Pamiętaj, że nie masz jeszcze year
kolumna podczas liczenia sumy, więc PARTITION BY
rok nie zadziała. Możesz przeczytać więcej o funkcjach okien tutaj.
Przykład II:
Jedna z kolumn w Twoich danych to year
. Chcesz pogrupować wszystkie swoje dane według tej kolumny i obliczyć łączną sumę pieniędzy zarobionych każdego roku.
data
tabela wygląda tak:
rok | miesiąc | dzień | pieniądze |
---|---|---|---|
2018 | 3 | 25 | 1700 |
2019 | 9 | 12 | 100 |
2018 | 7 | 14 | 1200 |
2018 | 1 | 5 | 400 |
2019 | 6 | 8 | 2000 |
2020 | 3 | 6 | 1500 |
Rozwiązanie 1 (wyświetlanie roku i zarobionych pieniędzy):
SELECT year, SUM(money) AS money_earned FROM data GROUP BY year;
Wynik:
rok | pieniądze_zarobione |
---|---|
2020 | 1500 |
2018 | 3300 |
2019 | 2100 |
Rozwiązanie 2 (wyświetlanie roku, miesiąca, dnia i pieniędzy zarobionych w odpowiednim roku):
SELECT year, month, day, SUM(money) OVER(PARTITION BY year) AS money_earned FROM data;
Wynik:
rok | miesiąc | dzień | pieniądze_zarobione |
---|---|---|---|
2018 | 3 | 25 | 3300 |
2018 | 7 | 14 | 3300 |
2018 | 1 | 5 | 3300 |
2019 | 9 | 12 | 2100 |
2019 | 6 | 8 | 2100 |
2020 | 3 | 6 | 1500 |
Dyskusja
W tym przykładzie założono, że masz już year
kolumna.
Jeśli chcesz wyświetlić tylko rok i łączne pieniądze zarobione w tym roku, proste GROUP BY
wystarczy. Jeśli nie czujesz się komfortowo z koncepcją GROUP BY, zajrzyj tutaj, gdzie to wyjaśnimy. Wystarczy użyć funkcji agregującej (tutaj:SUM
) z poprawną kolumną i na końcu zapytania grupujesz według year
. Możesz zmienić nazwę kolumny za pomocą AS
słowo kluczowe z nową nazwą. Ponadto, jeśli chcesz, aby dane były posortowane według roku, użyj ORDER BY
rok na końcu zapytania.
Sprawa jest bardziej skomplikowana, jeśli chcesz wyświetlić także inne kolumny. Wtedy potrzebujesz rozwiązania wykorzystującego funkcję okna (Rozwiązanie 2). Powinieneś użyć funkcji agregującej z odpowiednią kolumną (SUM(money)
) i napisz OVER()
klauzuli później. W tej klauzuli powinieneś użyć PARTITION BY
z kolumną, według której chcesz pogrupować. W ten sposób otrzymujesz:
SUM(money) OVER(PARTITION BY year)
W tym rozwiązaniu nie używasz GROUP BY
klauzula.
Możesz przeczytać więcej o funkcjach okien tutaj.