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

Cómo agrupar por año en T-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
  YEAR(transaction_date) AS year,
  SUM(money) AS money_earned
FROM data
GROUP BY YEAR(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,
  YEAR(transaction_date) AS year,
  SUM(money) OVER(PARTITION BY YEAR(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 la columna del año. Tiene la columna con fechas completas y le gustaría recuperar el año.

Para recuperar un año a partir de la fecha en SQL Server, puede usar YEAR() función. El argumento de esta función debe ser una fecha; aquí, la transaction_date columna.

Si desea mostrar 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 YEAR(transaction_date) . De ahí la Solución 1.

Si desea mostrar más columnas, utilice una función de ventana (Solución 2). Después de SUM(money) escribes el OVER() cláusula y, dado que le gustaría agrupar por cada año, utilice PARTITION BY YEAR(transaction_date) dentro de eso. Tenga en cuenta que aún no tiene el year columna al contar la suma, entonces PARTITION BY año no funcionará. Puede leer más sobre las funciones de la ventana aquí.

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 solo el año y el dinero total ganado en este año, un simple GROUP BY es suficiente. Si no te sientes 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. Además, si desea ordenar los datos por año, use ORDER BY año al final de su consulta.

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 adecuada (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í.