Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

Sacar cantidades totales por meses de trimestre

Estas en el tema de Sacar cantidades totales por meses de trimestre en el foro de SQL Server en Foros del Web. Hola a tod@s: Hacía tiempo que no entraba. No sé como plantear una consulta que necesito trabajando en Sql Server (T-SQL) El enunciado de la ...
  #1 (permalink)  
Antiguo 20/12/2007, 03:50
Avatar de zacktagnan  
Fecha de Ingreso: abril-2005
Mensajes: 501
Antigüedad: 19 años
Puntos: 3
Sacar cantidades totales por meses de trimestre

Hola a tod@s:

Hacía tiempo que no entraba.

No sé como plantear una consulta que necesito trabajando en Sql Server (T-SQL)

El enunciado de la consulta sería:
- Sabiendo el año, el trimestre y el ID de un cliente, sacar de la tabla ALBARANES_C, la suma total de litros para cada mes del trimestre y año dados, y para el cliente demandado sea la suma de cada mes 0 ó mayor de 0.

Es decir si:
@trimestre = 4
@anio = '2007'
@cliente = 4724

El resultado deseado de la consulta debería ser:

FECHA CANTIDAD
=================
Octubre 0,00
Noviembre 150,54
Diciembre 50,40


Yo tengo planteada para ahora la siguiente SQL:
Código:
DECLARE
@trimestre INT, @anio NVARCHAR(4), @cliente INT
SET @trimestre = 4
SET @anio = '2007'
SET @cliente = 4724

SELECT DATENAME(M, @anio + CONVERT(NVARCHAR, MONTH(fecha)) + '01') AS Fecha, SUM(ISNULL(litros, 0)) AS Cantidad
FROM ALBARANES_C
WHERE cliente = @cliente
 AND (YEAR(ALBARANES_C.fecha) = @anio AND fecha BETWEEN (dbo.func_darTrimestreFechaIni(@trimestre, @anio)) AND (dbo.func_darTrimestreFechaFin(@trimestre, @anio)))
GROUP BY MONTH(fecha)
ORDER BY MONTH(fecha)
El resultado que me da es este:
Código:
 FECHA         CANTIDAD
=================
Noviembre	150.54
Diciembre	   50.40
Es decir que como, para ese cliente, en el mes de octubre no se generaron registros en esta tabla de ALBARANES_C, no me saca la línea deseada de ese mes.

¿Cómo podría plantear la consulta para obtener el resultado deseado que planteo arriba?
__________________
Saludos,

zacktagnan.
=================================================
  #2 (permalink)  
Antiguo 20/12/2007, 11:33
 
Fecha de Ingreso: diciembre-2007
Mensajes: 6
Antigüedad: 16 años, 4 meses
Puntos: 0
Re: Sacar cantidades totales por meses de trimestre

hola zacktagnan, en si veo que todo parece estar correcto solo habria que revisar si relamente hay datos para el mes de octubre, y si tu funcion:
dbo.func_darTrimestreFechaIni(@trimestre, @anio)
te regresa el mes de octubre, o una fecha. Talvez deberias obtener el mes tanto del campo "fecha" como de tu funcion func_dartrimestrefechaini(), si es que devuelve una fecha.
  #3 (permalink)  
Antiguo 24/12/2007, 05:27
Avatar de zacktagnan  
Fecha de Ingreso: abril-2005
Mensajes: 501
Antigüedad: 19 años
Puntos: 3
Re: Sacar cantidades totales por meses de trimestre

Ya lo resolví finalmente.

Al final, metido todo en un Procedimiento, me queda así:

Código:
CREATE PROCEDURE [spSubInf_ListTrimClieRecog_MesLitros]
	@trimestre INT,
	@anio NVARCHAR(4),
	@cliente INT

AS

IF (@trimestre = 1)
BEGIN
	SELECT MONTH(@anio + '0101') AS NUM_MES, DATENAME(M, @anio + '0101') AS MES, ISNULL(SUM(ISNULL(litros, 0)), 0) AS Cantidad
	FROM ALBARANES_C
	WHERE cliente = @cliente
	 AND YEAR(fecha) = @anio AND MONTH(fecha) = 1
	UNION
	SELECT MONTH(@anio + '0201') AS NUM_MES, DATENAME(M, @anio + '0201') AS MES, ISNULL(SUM(ISNULL(litros, 0)), 0) AS Cantidad
	FROM ALBARANES_C
	WHERE cliente = @cliente
	 AND YEAR(fecha) = @anio AND MONTH(fecha) = 2
	UNION
	SELECT MONTH(@anio + '0301') AS NUM_MES, DATENAME(M, @anio + '0301') AS MES, ISNULL(SUM(ISNULL(litros, 0)), 0) AS Cantidad
	FROM ALBARANES_C
	WHERE cliente = @cliente
	 AND YEAR(fecha) = @anio AND MONTH(fecha) = 3
	ORDER BY NUM_MES
END

ELSE IF (@trimestre = 2)
BEGIN
	SELECT MONTH(@anio + '0401') AS NUM_MES, DATENAME(M, @anio + '0401') AS MES, ISNULL(SUM(ISNULL(litros, 0)), 0) AS Cantidad
	FROM ALBARANES_C
	WHERE cliente = @cliente
	 AND YEAR(fecha) = @anio AND MONTH(fecha) = 4
	UNION
	SELECT MONTH(@anio + '0501') AS NUM_MES, DATENAME(M, @anio + '0501') AS MES, ISNULL(SUM(ISNULL(litros, 0)), 0) AS Cantidad
	FROM ALBARANES_C
	WHERE cliente = @cliente
	 AND YEAR(fecha) = @anio AND MONTH(fecha) = 5
	UNION
	SELECT MONTH(@anio + '0601') AS NUM_MES, DATENAME(M, @anio + '0601') AS MES, ISNULL(SUM(ISNULL(litros, 0)), 0) AS Cantidad
	FROM ALBARANES_C
	WHERE cliente = @cliente
	 AND YEAR(fecha) = @anio AND MONTH(fecha) = 6
	ORDER BY NUM_MES
END

ELSE IF (@trimestre = 3)
BEGIN
	SELECT MONTH(@anio + '0701') AS NUM_MES, DATENAME(M, @anio + '0701') AS MES, ISNULL(SUM(ISNULL(litros, 0)), 0) AS Cantidad
	FROM ALBARANES_C
	WHERE cliente = @cliente
	 AND YEAR(fecha) = @anio AND MONTH(fecha) = 7
	UNION
	SELECT MONTH(@anio + '0801') AS NUM_MES, DATENAME(M, @anio + '0801') AS MES, ISNULL(SUM(ISNULL(litros, 0)), 0) AS Cantidad
	FROM ALBARANES_C
	WHERE cliente = @cliente
	 AND YEAR(fecha) = @anio AND MONTH(fecha) = 8
	UNION
	SELECT MONTH(@anio + '0901') AS NUM_MES, DATENAME(M, @anio + '0901') AS MES, ISNULL(SUM(ISNULL(litros, 0)), 0) AS Cantidad
	FROM ALBARANES_C
	WHERE cliente = @cliente
	 AND YEAR(fecha) = @anio AND MONTH(fecha) = 9
	ORDER BY NUM_MES
END

ELSE IF (@trimestre = 4)
BEGIN
	SELECT MONTH(@anio + '1001') AS NUM_MES, DATENAME(M, @anio + '1001') AS MES, ISNULL(SUM(ISNULL(litros, 0)), 0) AS Cantidad
	FROM ALBARANES_C
	WHERE cliente = @cliente
	 AND YEAR(fecha) = @anio AND MONTH(fecha) = 10
	UNION
	SELECT MONTH(@anio + '1101') AS NUM_MES, DATENAME(M, @anio + '1101') AS MES, ISNULL(SUM(ISNULL(litros, 0)), 0) AS Cantidad
	FROM ALBARANES_C
	WHERE cliente = @cliente
	 AND YEAR(fecha) = @anio AND MONTH(fecha) = 11
	UNION
	SELECT MONTH(@anio + '1201') AS NUM_MES, DATENAME(M, @anio + '1201') AS MES, ISNULL(SUM(ISNULL(litros, 0)), 0) AS Cantidad
	FROM ALBARANES_C
	WHERE cliente = @cliente
	 AND YEAR(fecha) = @anio AND MONTH(fecha) = 12
	ORDER BY NUM_MES
END

GO
__________________
Saludos,

zacktagnan.
=================================================
  #4 (permalink)  
Antiguo 26/12/2007, 16:47
Avatar de Beakdan  
Fecha de Ingreso: diciembre-2001
Ubicación: Monterrey, Nuevo León
Mensajes: 433
Antigüedad: 22 años, 4 meses
Puntos: 7
Re: Sacar cantidades totales por meses de trimestre

¿No te estás complicando demasiado? La solución indicando el rango inicial y final de la fecha era excelente, sólo no me convence el uso de una función para obtener la fecha.
¿Que tal si no usas las funciones?

Código:
DECLARE @trimestre INT, @anio CHAR(4), @cliente INT
DECLARE @dateini DATETIME, @dateend DATETIME
SET @trimestre = 4
SET @anio ='2007'
SET @dateini = CASE @trimestre
                   WHEN 1 THEN @anio +'0101'
                   WHEN 2 THEN @anio +'0401'
                   WHEN 3 THEN @anio +'0701'
                   WHEN 4 THEN @anio +'1001'
               END
SET @dateend =dateadd(m, 3, @dateini)
SET @cliente = 4724
 
SELECT      DATENAME(M, @anio + RIGHT('0'+CAST(MONTH(periodo) AS VARCHAR(2)), 2) + '01') AS Fecha,
         SUM(ISNULL(litros, 0)) AS Cantidad
FROM        ALBARANES_C
WHERE       cliente = @cliente
          AND fecha >= @dateini
          AND fecha < @dateend
GROUP BY    MONTH(fecha)
ORDER BY    MONTH(fecha) 
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 07:09.