varios valores una sumar registros por mes distintos contar consultas columna campos agrupar agrupados agrupadas agrupacion sql sql-server

registros - sumar valores de una columna sql



Agrupación de SQL por mes y año (5)

No estoy seguro de qué debo escribir en la siguiente consulta SQL para mostrar la columna de ''fecha'' como esta: "mes-año" - "9-2011".

SELECT MONTH(date) + ''.'' + YEAR(date) AS Mjesec, SUM(marketingExpense) AS SumaMarketing, SUM(revenue) AS SumaZarada FROM [Order] WHERE (idCustomer = 1) AND (date BETWEEN ''2001-11-3'' AND ''2011-11-3'') GROUP BY MONTH(date), YEAR(date)

Entonces, lo que quiero hacer es cambiar los datos de la primera columna para mostrar el mes y el año en lugar de mostrar solo el mes.


En postgresql puedo escribir una consulta similar con una función de formato de fecha (to_char) y agrupar solo por fecha:

SELECT to_char (datum, ''MM-YYYY'') AS mjesec FROM test GROUP BY datum ORDER BY datum;

Tal cosa es seguramente posible con SQL Server también, ¿no es así?


Si desea seguir teniendo el campo en el tipo de datos datetime, intente usar esto:

SELECT DATEADD(MONTH, DATEDIFF(MONTH, 0, o.[date]), 0) AS Mjesec, SUM(marketingExpense) AS SumaMarketing, SUM(revenue) AS SumaZarada FROM [Order] o WHERE (idCustomer = 1) AND (o.[date] BETWEEN ''2001-11-3'' AND ''2011-11-3'') GROUP BY DATEADD(MONTH, DATEDIFF(MONTH, 0, o.[date]), 0)

También es fácil cambiar al grupo por horas, días, semanas, años ...
Espero que sea de utilidad para alguien,

¡Saludos!


Si entiendo correctamente. Para agrupar sus resultados según lo solicitado, su cláusula Group By debe tener la misma expresión que su declaración de selección.

GROUP BY MONTH(date) + ''.'' + YEAR(date)

Para mostrar la fecha como formato "mes-fecha", cambie "." a ''-'' La sintaxis completa sería algo como esto.

SELECT MONTH(date) + ''-'' + YEAR(date) AS Mjesec, SUM(marketingExpense) AS SumaMarketing, SUM(revenue) AS SumaZarada FROM [Order] WHERE (idCustomer = 1) AND (date BETWEEN ''2001-11-3'' AND ''2011-11-3'') GROUP BY MONTH(date) + ''.'' + YEAR(date)


Supongo que es MS SQL, ya que se parece a la sintaxis de MS SQL.

Así que debes poner en la línea de grupo lo mismo que en select ex:

Select MONTH(date)+''-''+YEAR(date), .... ... ... ... group by MONTH(date)+''-''+YEAR(date)


SELECT CAST(MONTH(date) AS VARCHAR(2)) + ''-'' + CAST(YEAR(date) AS VARCHAR(4)) AS Mjesec, SUM(marketingExpense) AS SumaMarketing, SUM(revenue) AS SumaZarada FROM [Order] WHERE (idCustomer = 1) AND (date BETWEEN ''2001-11-3'' AND ''2011-11-3'') GROUP BY CAST(MONTH(date) AS VARCHAR(2)) + ''-'' + CAST(YEAR(date) AS VARCHAR(4))

O como mencionó @ 40-Love, puedes lanzar con ceros iniciales:

GROUP BY CAST(YEAR(date) AS VARCHAR(4)) + ''-'' + right(''00'' + CAST(MONTH(date) AS VARCHAR(2)), 2)