Database
 sql >> Base de Dados >  >> RDS >> Database

Como agrupar por ano em T-SQL

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.