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:
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!