sql >> Base de Datos >  >> RDS >> Database

Cómo agrupar por año en SQL

Problema:

Quiere agrupar sus datos por año.

Ejemplo I:

Una de las columnas en sus datos es transaction_date . Contiene una fecha. Le gustaría agrupar todos sus datos por año y calcular el dinero total ganado cada año.

Los data la tabla se ve así:

fecha_transacción dinero
2018-03-25 1700
2019-09-12 100
2018-07-14 1200
2018-01-05 400
2019-06-08 2000
2020-03-06 1500

Solución 1 (mostrar el año y el dinero ganado):

SELECT
  EXTRACT(year FROM transaction_date) AS year,
  SUM(money) AS money_earned
FROM data
GROUP BY EXTRACT(year FROM transaction_date);

El resultado es:

año dinero_ganado
2020 1500
2019 2100
2018 3300

Solución 2 (mostrando la fecha completa, el año y el dinero ganado en el año correspondiente):

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;

El resultado es:

fecha_transacción año dinero_ganado
2018-03-25 2018 3300
2018-07-14 2018 3300
2018-01-05 2018 3300
2019-09-12 2019 2100
2019-06-08 2019 2100
2020-03-06 2020 1500

Discusión:

En este ejemplo, se supone que no tiene el year columna. En su lugar, tiene la columna con fechas completas.

Primero, necesita recuperar un año a partir de la fecha. Puedes usar el EXTRACT(part FROM date) función para hacerlo. En su caso, le gustaría extraer el año, por lo que la part es year . La date es la columna que contiene las fechas:transaction_date columna. Es una buena idea cambiar el nombre de la columna al año posterior. Si desea obtener más información sobre el EXTRACT función y cómo recuperar diferentes partes de la fecha, puede encontrarlo aquí.

Si desea mostrar solo el año y el dinero total ganado en este año, puede usar un GROUP BY . La primera columna seleccionada es el año extraído de la fecha. La segunda columna es la función agregada SUM(money) . Al final de la consulta, necesita un GROUP BY EXTRACT(year FROM transaction_date) o, más simple, GROUP BY 1 (since EXTRACT(year FROM transaction_date) es la primera columna.)

Si desea mostrar más columnas, necesita una función de ventana (Solución 2). Después de SUM(money) escribes el OVER() cláusula y, dado que le gustaría calcular la suma de cada año, utilice PARTITION BY EXTRACT(year FROM transaction_date) dentro de eso. Tenga en cuenta que aún no tiene la columna del año al calcular la suma, por lo que PARTITION BY year no funcionará:obtendrá un error 'column "year" does not exist' . Puede leer más sobre las funciones de la ventana en este artículo.

Ejemplo II:

Una de las columnas en sus datos es year . Le gustaría agrupar todos sus datos por esta columna y calcular el dinero total ganado cada año.

Los data la tabla se ve así:

año mes día dinero
2018 3 25 1700
2019 9 12 100
2018 7 14 1200
2018 1 5 400
2019 6 8 2000
2020 3 6 1500

Solución 1 (mostrar el año y el dinero ganado):

SELECT
  year,
  SUM(money) AS money_earned
FROM data
GROUP BY year;

El resultado es:

año dinero_ganado
2020 1500
2018 3300
2019 2100

Solución 2 (mostrar año, mes, día y el dinero ganado en el año correspondiente):

SELECT
  year,
  month,
  day,
  SUM(money) OVER(PARTITION BY year) AS money_earned
FROM data;

El resultado es:

año mes día dinero_ganado
2018 3 25 3300
2018 7 14 3300
2018 1 5 3300
2019 9 12 2100
2019 6 8 2100
2020 3 6 1500

Discusión:

En este ejemplo, se supone que ya tiene el year columna.

Si desea mostrar el año y el dinero total ganado en este año, un simple GROUP BY es suficiente. Si no se siente cómodo con el concepto de GROUP BY , echa un vistazo aquí donde te lo explicamos. Simplemente usa la función de agregado (aquí:SUM ) con la columna correcta y al final de la consulta se agrupa por year . Puede cambiar el nombre de la columna usando el AS palabra clave con un nuevo nombre.

Es más complicado si también desea mostrar algunas otras columnas. Entonces necesita la solución usando una función de ventana (Solución 2). Debe utilizar la función de agregado con la columna correspondiente (aquí:SUM(money) ) y escribe OVER() cláusula posterior. En esta cláusula, debe usar PARTITION BY con la columna por la que desea agrupar. Así es como obtienes:

SUM(money) OVER(PARTITION BY year)

En esta solución, no usa un GROUP BY cláusula.

Puede leer más sobre las funciones de la ventana aquí.