Problema:
Você deseja agrupar seus dados por ano.
Exemplo I:
Uma das colunas em seus dados é
transaction_date
. Ele contém uma data. Você gostaria de agrupar todos os seus dados por ano e calcular o total de dinheiro ganho a cada ano. Os
data
tabela fica assim:transaction_date | dinheiro |
---|---|
25-03-2018 | 1700 |
2019-09-12 | 100 |
14-07-2018 | 1200 |
2018-01-05 | 400 |
2019-06-08 | 2000 |
2020-03-06 | 1500 |
Solução 1 (exibindo o ano e o dinheiro ganho):
SELECT YEAR(transaction_date) AS year, SUM(money) AS money_earned FROM data GROUP BY YEAR(transaction_date);
O resultado é:
ano | dinheiro_ganho |
---|---|
2020 | 1500 |
2019 | 2100 |
2018 | 3300 |
Solução 2 (exibindo a data completa, o ano e o dinheiro ganho no ano correspondente):
SELECT transaction_date AS transaction_date, YEAR(transaction_date) AS year, SUM(money) OVER(PARTITION BY YEAR(transaction_date)) AS money_earned FROM data;
O resultado é:
transaction_date | ano | dinheiro_ganho |
---|---|---|
25-03-2018 | 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 |
Discussão:
Neste exemplo, supõe-se que você não tenha a coluna do ano. Você tem a coluna com datas completas e gostaria de recuperar o ano dela.
Para recuperar um ano da data no SQL Server, você pode usar o
YEAR()
função. O argumento desta função deve ser uma data – aqui, o transaction_date
coluna. Se quiser exibir o ano e o total de dinheiro ganho neste ano, você pode usar um
GROUP BY
. A primeira coluna selecionada é o ano extraído da data. A segunda coluna é a função agregada SUM(money)
. No final da consulta, você precisa de um GROUP BY
YEAR(transaction_date)
. Daí a Solução 1. Se desejar exibir mais colunas, use uma função de janela (Solução 2). Após
SUM(money)
você escreve o OVER()
cláusula e, como você deseja agrupar por ano, use PARTITION BY YEAR(transaction_date)
dentro dele. Observe que você ainda não tem o year
coluna ao contar a soma, então PARTITION BY
ano não vai funcionar. Você pode ler mais sobre as funções da janela aqui. Exemplo II:
Uma das colunas em seus dados é
year
. Você gostaria de agrupar todos os seus dados por esta coluna e calcular o total de dinheiro ganho a cada ano. Os
data
tabela fica assim:ano | mês | dia | dinheiro |
---|---|---|---|
2018 | 3 | 25 | 1700 |
2019 | 9 | 12 | 100 |
2018 | 7 | 14 | 1200 |
2018 | 1 | 5 | 400 |
2019 | 6 | 8 | 2000 |
2020 | 3 | 6 | 1500 |
Solução 1 (exibindo o ano e o dinheiro ganho):
SELECT year, SUM(money) AS money_earned FROM data GROUP BY year;
O resultado é:
ano | dinheiro_ganho |
---|---|
2020 | 1500 |
2018 | 3300 |
2019 | 2100 |
Solução 2 (exibindo ano, mês, dia e o dinheiro ganho no ano correspondente):
SELECT year, month, day, SUM(money) OVER(PARTITION BY year) AS money_earned FROM data;
O resultado é:
ano | mês | dia | dinheiro_ganho |
---|---|---|---|
2018 | 3 | 25 | 3300 |
2018 | 7 | 14 | 3300 |
2018 | 1 | 5 | 3300 |
2019 | 9 | 12 | 2100 |
2019 | 6 | 8 | 2100 |
2020 | 3 | 6 | 1500 |
Discussão
Neste exemplo, supõe-se que você já tenha o
year
coluna. Se você quiser exibir apenas o ano e o total de dinheiro ganho neste ano, um simples
GROUP BY
basta. Se você não se sente confortável com o conceito de GROUP BY, dê uma olhada aqui onde explicamos. Você simplesmente usa a função agregada (aqui:SUM
) com a coluna correta e no final da consulta você agrupa por year
. Você pode renomear a coluna usando o AS
palavra-chave com um novo nome. Além disso, se você quiser classificar os dados por ano, use ORDER BY
ano no final de sua consulta. É mais complicado se você também quiser exibir algumas outras colunas. Então você precisa da solução usando uma função de janela (Solução 2). Você deve usar a função de agregação com a coluna apropriada (
SUM(money)
) e escreva o OVER()
cláusula depois. Nesta cláusula, você deve usar PARTITION BY
com a coluna pela qual você deseja agrupar. É assim que você obtém:SUM(money) OVER(PARTITION BY year)
Nesta solução, você não usa um
GROUP BY
cláusula. Você pode ler mais sobre as funções da janela aqui.