¿como puedo hacer un query SQL, que me de el resultado por cada día del mes?

publicado por: Anonymous

Bueno ahi va de nuevo la pregunta, tengo el siguiente query:

SELECT [date] 
      ,[stationNumber]
      ,[stationName]
      ,[stationComercialName]
      ,[productDescription]
      ,[productColor]
      ,[productCode]
      ,[shift]
      ,SUM([quantity]) as litros
      ,SUM([amount]) as importe
FROM [NexusFuel].[dbo].[vwStationFuelSales]
WHERE [date] >='2017-07-01' AND [date] <= '2017-07-31' AND [stationNumber] = 5087
GROUP BY [date]
      ,[stationNumber]
      ,[stationName]
      ,[stationComercialName]
      ,[productDescription]
      ,[productColor]
      ,[productCode]
      ,[shift]

esto me arroja el resultado de cada dia del mes hacia abajo en filas, y lo que yo quiero que me lo de en columnas, “CADA DIA DEL MES ES UNA COLUMNA” y ya abajo ponerle las ventas, algo similar a esto:

introducir la descripción de la imagen aquí

Espero haberme explicado bien.

Saludos!

solución

Lo que puedes hacer, es hacer un SUM() para cada día del mes que solicitas, algo así:

DECLARE @FechaDesde DATETIME
DECLARE @FechaHasta DATETIME

SELECT  @FechaDesde = '2017-07-01'
SELECT  @FechaHasta = '2017-07-31'

SELECT [date] 
      ,[stationNumber]
      ,[stationName]
      ,[stationComercialName]
      ,[productDescription]
      ,[productColor]
      ,[productCode]
      ,[shift]
      ,SUM(CASE WHEN [date] = DATEADD(DAY, 0, @FechaDesde) THEN [quantity] ELSE 0 END) as Dia_1
      ,SUM(CASE WHEN [date] = DATEADD(DAY, 1, @FechaDesde) THEN [quantity] ELSE 0 END) as Dia_2
      ,SUM(CASE WHEN [date] = DATEADD(DAY, 2, @FechaDesde) THEN [quantity] ELSE 0 END) as Dia_3
      ....
      ,SUM(CASE WHEN [date] = DATEADD(DAY, 30, @FechaDesde) THEN [quantity] ELSE 0 END) as Dia_31

    FROM [NexusFuel].[dbo].[vwStationFuelSales]
    WHERE   [date] >= @FechaDesde 
            AND [date] <= FechaHasta 
            AND [stationNumber] = 5087
    GROUP BY [date]
      ,[stationNumber]
      ,[stationName]
      ,[stationComercialName]
      ,[productDescription]
      ,[productColor]
      ,[productCode]
      ,[shift]

Usando la condición CASE WHEN [date] = DATEADD(DAY, 0, @FechaDesde) THEN [quantity] ELSE 0 END en el SUM() logramos sumar únicamente si el registro corresponde al día 1, (sumamos 0 días al la @FechaDesde: ‘2017-07-01’), tenemos que construir 31 clausulas SUM como la anterior, sumando un día cada vez al DATEADD , con esto cubrimos hasta el máximo de días que puede tener cualquier mes

Algunos comentarios:

  • Reemplace las fecha “duras” por el uso de variables, sino deberías reescribir la consulta cada vez que modifiques los parámetros
  • Los meses de menos de 31 días, van a funcionar bien, pero obviamente las columnas adicionales estarán en 0.
Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *