Проблем:
Искате да групирате данните си по години.
Пример I:
Една от колоните във вашите данни е transaction_date
. Съдържа дата. Искате да групирате всичките си данни по години и да изчислите общите пари, спечелени всяка година.
data
таблицата изглежда така:
transaction_date | пари |
---|---|
25-03-2018 | 1700 |
12.09.2019 | 100 |
14.07.2018 | 1200 |
2018-01-05 | 400 |
2019-06-08 | 2000 |
2020-03-06 | 1500 |
Решение 1 (показване на годината и спечелените пари):
SELECT YEAR(transaction_date) AS year, SUM(money) AS money_earned FROM data GROUP BY YEAR(transaction_date);
Резултатът е:
година | печелени_пари |
---|---|
2020 | 1500 |
2019 | 2100 |
2018 | 3300 |
Решение 2 (показване на пълната дата, годината и парите, спечелени през съответната година):
SELECT transaction_date AS transaction_date, YEAR(transaction_date) AS year, SUM(money) OVER(PARTITION BY YEAR(transaction_date)) AS money_earned FROM data;
Резултатът е:
transaction_date | година | печелени_пари |
---|---|---|
25-03-2018 | 2018 | 3300 |
14.07.2018 | 2018 | 3300 |
2018-01-05 | 2018 | 3300 |
12.09.2019 | 2019 | 2100 |
2019-06-08 | 2019 | 2100 |
2020-03-06 | 2020 | 1500 |
Дискусия:
В този пример се приема, че нямате колоната за годината. Имате колоната с пълни дати и искате да извлечете годината от нея.
За да извлечете година от датата в SQL Server, можете да използвате YEAR()
функция. Аргументът на тази функция трябва да бъде дата – тук transaction_date
колона.
Ако искате да покажете годината и общите пари, спечелени през тази година, можете да използвате GROUP BY
. Първата избрана колона е годината, извлечена от датата. Втората колона е агрегатната функция SUM(money)
. В края на заявката се нуждаете от GROUP BY
YEAR(transaction_date)
. Оттук решение 1.
Ако искате да покажете повече колони, използвайте функция на прозорец (Решение 2). След SUM(money)
пишете OVER()
клауза и, тъй като искате да групирате по всяка година, използвайте PARTITION BY YEAR(transaction_date)
вътре в него. Имайте предвид, че все още нямате year
колона при отчитане на сумата, така че PARTITION BY
година няма да работи. Можете да прочетете повече за функциите на прозореца тук.
Пример II:
Една от колоните във вашите данни е year
. Искате да групирате всичките си данни по тази колона и да изчислите общите спечелени пари всяка година.
data
таблицата изглежда така:
година | месец | ден | пари |
---|---|---|---|
2018 | 3 | 25 | 1700 |
2019 | 9 | 12 | 100 |
2018 | 7 | 14 | 1200 |
2018 | 1 | 5 | 400 |
2019 | 6 | 8 | 2000 |
2020 | 3 | 6 | 1500 |
Решение 1 (показване на годината и спечелените пари):
SELECT year, SUM(money) AS money_earned FROM data GROUP BY year;
Резултатът е:
година | печелени_пари |
---|---|
2020 | 1500 |
2018 | 3300 |
2019 | 2100 |
Решение 2 (показва година, месец, ден и парите, спечелени през съответната година):
SELECT year, month, day, SUM(money) OVER(PARTITION BY year) AS money_earned FROM data;
Резултатът е:
година | месец | ден | печелени_пари |
---|---|---|---|
2018 | 3 | 25 | 3300 |
2018 | 7 | 14 | 3300 |
2018 | 1 | 5 | 3300 |
2019 | 9 | 12 | 2100 |
2019 | 6 | 8 | 2100 |
2020 | 3 | 6 | 1500 |
Дискусия
В този пример се предполага, че вече имате year
колона.
Ако искате да покажете само годината и общите пари, спечелени през тази година, просто GROUP BY
е достатъчно. Ако не се чувствате комфортно с концепцията за GROUP BY, вижте тук, където я обясняваме. Вие просто използвате агрегатната функция (тук:SUM
) с правилната колона и в края на заявката групирате по year
. Можете да преименувате колоната с помощта на AS
ключова дума с ново име. Освен това, ако искате данните да бъдат сортирани по година, използвайте ORDER BY
година в края на вашата заявка.
По-сложно е, ако искате да покажете и някои други колони. След това се нуждаете от решението с помощта на функция прозорец (Решение 2). Трябва да използвате агрегатната функция със съответната колона (SUM(money)
). ) и напишете OVER()
клауза след това. В тази клауза трябва да използвате PARTITION BY
с колоната, по която искате да групирате. Така получавате:
SUM(money) OVER(PARTITION BY year)
В това решение не използвате GROUP BY
клауза.
Можете да прочетете повече за функциите на прозореца тук.