Respuesta: Calculo de Columnas
Código SQL:
Ver originalDROP TABLE #mitabla DROP TABLE #mitabla2 CREATE TABLE #mitabla( Producto VARCHAR(04), Disponible NUMERIC(16,8), Proceso NUMERIC(16,8), Lote NUMERIC(16,8), Periodo INT, Requerido NUMERIC(16,8), DisponibleNuevo NUMERIC(16,8), Saldo NUMERIC(16,8), Demanda NUMERIC(16,8), Necesidad NUMERIC(16,8), Saldo_ns NUMERIC(16,8) ) CREATE TABLE #mitabla2( Producto VARCHAR(04), Disponible NUMERIC(16,8), Proceso NUMERIC(16,8), Lote NUMERIC(16,8), Periodo INT, Requerido NUMERIC(16,8), DisponibleNuevo NUMERIC(16,8), Saldo NUMERIC(16,8), Demanda NUMERIC(16,8), Necesidad NUMERIC(16,8), Saldo_ns NUMERIC(16,8) ) INSERT INTO #mitabla(Producto, Disponible, Proceso, Lote, Periodo, Requerido, DisponibleNuevo, Saldo, Demanda, Necesidad, Saldo_ns) VALUES('1001',200,20,1000,201406,150,200,-70,0,0,0) INSERT INTO #mitabla(Producto, Disponible, Proceso, Lote, Periodo, Requerido, DisponibleNuevo, Saldo, Demanda, Necesidad, Saldo_ns) VALUES('1001',200,20,1000,201407,100,70,30,30,0,0) INSERT INTO #mitabla(Producto, Disponible, Proceso, Lote, Periodo, Requerido, DisponibleNuevo, Saldo, Demanda, Necesidad, Saldo_ns) VALUES('1001',200,20,1000,201408,120,0,120,120,0,0 ) INSERT INTO #mitabla(Producto, Disponible, Proceso, Lote, Periodo, Requerido, DisponibleNuevo, Saldo, Demanda, Necesidad, Saldo_ns) VALUES('1001',200,20,1000,201409,80,0,80,80,0,0) INSERT INTO #mitabla(Producto, Disponible, Proceso, Lote, Periodo, Requerido, DisponibleNuevo, Saldo, Demanda, Necesidad, Saldo_ns) VALUES('1001',200,20,1000,201410,25,0,25,25,0,0) INSERT INTO #mitabla(Producto, Disponible, Proceso, Lote, Periodo, Requerido, DisponibleNuevo, Saldo, Demanda, Necesidad, Saldo_ns) VALUES('1001',200,20,1000,201411,150,0,150,150,0,0 ) INSERT INTO #mitabla(Producto, Disponible, Proceso, Lote, Periodo, Requerido, DisponibleNuevo, Saldo, Demanda, Necesidad, Saldo_ns) VALUES('1001',200,20,1000,201412,300,0,300,300,0,0 ) INSERT INTO #mitabla(Producto, Disponible, Proceso, Lote, Periodo, Requerido, DisponibleNuevo, Saldo, Demanda, Necesidad, Saldo_ns) VALUES('1002',100,80,500,201501,50,100,-130,0,0,0) INSERT INTO #mitabla(Producto, Disponible, Proceso, Lote, Periodo, Requerido, DisponibleNuevo, Saldo, Demanda, Necesidad, Saldo_ns) VALUES('1002',100,80,500,201501,30,130,-100,0,0,0) INSERT INTO #mitabla(Producto, Disponible, Proceso, Lote, Periodo, Requerido, DisponibleNuevo, Saldo, Demanda, Necesidad, Saldo_ns) VALUES('1002',100,80,500,201502,65,100,-350,0,0,0) DROP TABLE #temp SELECT *,ROW_NUMBER() OVER(partition BY producto ORDER BY producto) AS rn,IDENTITY(INT,1,1) AS [ROW] INTO #temp FROM #mitabla /*"Necesidad" la primera ves es igual a: si la "Demanda" actual es menor a "Lote" muestra Lote si no muestra Demanda, en adelante será igual a: si el "Saldo" anterior es mayor a la Demanda actual es igual a 0 caso contrario, si la Demanda actual es menor a "Lote" muestra Lote si no muestra Demanda actual. "Saldo_ns" la primera ves es igual a: "Necesidad" actual menos(-) "Demanda" actual, en adelante será igual a: "Necesidad" actual mas(+) "Saldo" anterior menos(-) "Demanda" actual */ DECLARE @x INT DECLARE @disponible_nuevo INT DECLARE @saldo INT DECLARE @demanda INT DECLARE @rn INT DECLARE @necesidad INT DECLARE @saldo_ns INT SET @x=1 SET @rn=1 while @x<=(SELECT COUNT(*) FROM #temp) BEGIN SELECT @rn=rn FROM #temp WHERE [ROW]=@x IF @rn=1 BEGIN SELECT @necesidad=necesidad,@saldo=saldo FROM( SELECT CASE WHEN Demanda<Lote THEN Lote ELSE Demanda END AS necesidad,saldo FROM #temp WHERE [ROW]=@x ) AS t1 SELECT @saldo_ns=@necesidad-demanda FROM #temp WHERE [ROW]=@x END ELSE BEGIN SELECT @necesidad=campo FROM( SELECT CASE WHEN @saldo>demanda THEN 0 WHEN demanda<lote THEN lote ELSE demanda END AS campo FROM #temp WHERE [ROW]=@x ) AS t1 SELECT @saldo_ns= @necesidad + @saldo - demanda FROM #temp WHERE [ROW]=@x SELECT @saldo=saldo FROM #temp WHERE [ROW]=@x END INSERT INTO #mitabla2 SELECT producto,disponible,proceso,lote,periodo,requerido,disponiblenuevo,saldo,demanda,@necesidad,@saldo_ns FROM #temp WHERE [ROW]=@x SET @x=@x+1 END SELECT * FROM #mitabla2
veo inconsistencias en los resultados, podrias definir bien los calculos como obtienes 97 en la segunda necesidad, porque segun las condiciones que pusiste no se obtiene 97 sino 1000 que es el valor de lote porque el valor anterior es -70
podrias expicar con peras y manzanas???
__________________ What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me |