Obtener reporte semanal con filtro de dos fechas

Buen día expertos, me estoy enfrentando con lo siguiente:

Requiero generar un query para un reporte, en el que se debe visualizar el número de semana, la suma de los montos de las facturas que se vencen en esa semana, y la suma de las promesas de pago que se agendaron para esa semana.

Mi primer problema fue que si uso una cláusula WHERE normal, sólo toma las facturas que serán pagadas en la misma semana que se vencen, y el resto las deja fuera. Hice el intento con una tabla temporal y un ciclo WHILE:

CREATE TABLE #TempTable (Contador tinyint, SumaPorVencer varchar(20), NuevaPrueba varchar(20))

DECLARE @Counter INT 
SET @Counter = 25
WHILE (@Counter <= 30)
BEGIN

INSERT INTO #TempTable

SELECT @Counter AS [Contador], SUM(SumaPorVencer) AS [Suma por Vencer], SUM(NuevaPrueba) AS [Suma Nueva Prueba] FROM
(
       SELECT DISTINCT
             CASE
                    WHEN DATEPART(WEEK, T0.DocDueDate) BETWEEN ISNULL(@Counter, 1) AND ISNULL(@Counter, 53) THEN DATEPART(WEEK,T0.DocDueDate)
             END AS [PruebaVencimiento], 
             DATEPART(WEEK,T0.DocDueDate) AS SemanaVencimiento,
             CASE 
                    WHEN T0.DocCur = 'USD' AND DATEPART(WEEK, T0.DocDueDate) BETWEEN ISNULL(@Counter, 1) AND ISNULL(@Counter, 53) THEN SUM(T0.DocTotalFC - T0.PaidFC) 
                    WHEN T0.DocCur = '$' AND DATEPART(WEEK, T0.DocDueDate) BETWEEN ISNULL(@Counter, 1) AND ISNULL(@Counter, 53) THEN SUM(T0.DocTotal - T0.PaidToDate) 
             END AS 'SumaPorVencer',
             A1.FechaCompromiso, DATEPART(WEEK,A1.FechaCompromiso) AS SemanaCompromiso,
             CASE
                    WHEN DATEPART(WEEK, A1.FechaCompromiso) BETWEEN ISNULL(@Counter, 1) AND ISNULL(@Counter, 53) THEN A1.Saldo
             END AS [NuevaPrueba] 
       FROM GLASSFIBER.dbo.OINV T0
             INNER JOIN GLASSFIBER.dbo.INV1 T1 ON T0.DocEntry = T1.DocEntry
             INNER JOIN GLASSFIBER.dbo.OSLP T2 ON T0.SlpCode = T2.SlpCode
             LEFT JOIN INDICADORES.dbo.Pagos_PP_Facturas A1 ON T0.DocNum = A1.Factura
       WHERE
             T1.[TargetType] <> '14' AND 
             T0.Canceled NOT IN ('C', 'Y') AND 
             (T0.DocTotal - T0.PaidToDate <> 0) AND 
             (DATEPART(WEEK, T0.DocDueDate) BETWEEN ISNULL(@Counter, 1) AND ISNULL(@Counter, 53)) OR
             (DATEPART(WEEK, A1.FechaCompromiso) BETWEEN ISNULL(@Counter, 1) AND ISNULL(@Counter, 53)) AND
             DATEPART(YEAR, T0.DocDueDate) = 2020
       GROUP BY T0.DocDueDate, T0.DocCur, A1.FechaCompromiso, A1.Saldo
       
) Tabla

SET @Counter  = @Counter  + 1

END

SELECT Contador, SumaPorVencer, NuevaPrueba FROM #TempTable

DROP TABLE #TempTable

En principio cumple con su función, pero en cuanto quiero obtener el resultado de más de 5 semanas (en el ejemplo puse de la 25 a la 30), demora arriba de 5 segundos en ejecutarse, lo que me hace pensar que está mal hecho y puede optimizarse.

El resultado esperado es el siguiente:

Ssms_B6KgnVUFsS
Los campos con los que hago el filtro de las semanas son T0.DocDueDate (Fecha de vencimiento de Factura) y A1.FechaCompromiso (Fecha en la que se hará el pago).

Espero puedan orientarme, cualquier comentario o sugerencia serán de gran ayuda. Muchas gracias!

En principio no es necesario un bucle, el tema es que estas tomando mal los parametros del “Group By”, y veo redundancia entre el Where y los campos a mostrar.

Select * from 
(
Select DATEPART(WEEK, T0.DocDueDate) as 'Semana',
CASE 
                    WHEN T0.DocCur = 'USD' THEN (T0.DocTotalFC - T0.PaidFC) 
                    WHEN T0.DocCur = '$' THEN (T0.DocTotal - T0.PaidToDate) 
             END AS 'PorVencer',
             .....
FROM .........
) A
group by Semana, SUMA(PorVencer), ....

Algo asi.

4 Me gusta

Muchas gracias Willy quizá si me compliqué demasiado con lo que traté de hacer. Te agradezco tu apoyo era justo lo que necesitaba para poder resolverlo.