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