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.