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

Como agrupar por ano no 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 date 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
  EXTRACT(year FROM transaction_date) AS year,
  SUM(money) AS money_earned
FROM data
GROUP BY EXTRACT(year FROM 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,
  EXTRACT(year FROM transaction_date) AS year,
  SUM(money) OVER(PARTITION BY EXTRACT(year FROM 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 o year coluna. Em vez disso, você tem a coluna com datas completas.

Primeiro, você precisa recuperar um ano a partir da data. Você pode usar o EXTRACT(part FROM date) função para fazê-lo. No seu caso, você gostaria de extrair o ano, então a part é year . A date é a coluna que contém as datas – o transaction_date coluna. É uma boa ideia renomear a coluna para ano depois. Se você quiser saber mais sobre o EXTRACT função e como recuperar diferentes partes da data, você pode encontrá-lo aqui.

Se quiser exibir apenas 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 EXTRACT(year FROM transaction_date) ou, mais simples, GROUP BY 1 (since EXTRACT(year FROM transaction_date) é a primeira coluna.)

Se você quiser exibir mais colunas, precisará de uma função de janela (Solução 2). Após SUM(money) você escreve o OVER() cláusula e, como você deseja calcular a soma para cada ano, use PARTITION BY EXTRACT(year FROM transaction_date) dentro dele. Observe que você ainda não tem a coluna do ano ao calcular a soma, então PARTITION BY year não funcionará - você receberá um erro 'column "year" does not exist' . Você pode ler mais sobre as funções da janela neste artigo.

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 date 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 o ano e o total de dinheiro ganho neste ano, um simples GROUP BY basta. Se você não se sentir 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.

É 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 (aqui: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.