Ver Mensaje Individual
  #7 (permalink)  
Antiguo 15/08/2014, 09:26
Avatar de Libras
Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Calculo de Columnas

Código SQL:
Ver original
  1. DROP TABLE #mitabla
  2. DROP TABLE #mitabla2
  3. CREATE TABLE #mitabla(
  4. Producto VARCHAR(04),
  5. Disponible NUMERIC(16,8),
  6. Proceso NUMERIC(16,8),
  7. Lote NUMERIC(16,8),
  8. Periodo INT,
  9. Requerido NUMERIC(16,8),
  10. DisponibleNuevo NUMERIC(16,8),
  11. Saldo NUMERIC(16,8),
  12. Demanda NUMERIC(16,8),
  13.  
  14. Necesidad NUMERIC(16,8),
  15. Saldo_ns NUMERIC(16,8)
  16. )
  17.  
  18. CREATE TABLE #mitabla2(
  19. Producto VARCHAR(04),
  20. Disponible NUMERIC(16,8),
  21. Proceso NUMERIC(16,8),
  22. Lote NUMERIC(16,8),
  23. Periodo INT,
  24. Requerido NUMERIC(16,8),
  25. DisponibleNuevo NUMERIC(16,8),
  26. Saldo NUMERIC(16,8),
  27. Demanda NUMERIC(16,8),
  28.  
  29. Necesidad NUMERIC(16,8),
  30. Saldo_ns NUMERIC(16,8)
  31. )
  32.  
  33.  
  34.  
  35. 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)
  36. 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)
  37. 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 )
  38. 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)
  39. 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)
  40. 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 )
  41. 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 )
  42. 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)
  43. 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)
  44. 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)
  45.  
  46.  
  47. DROP TABLE #temp
  48. SELECT *,ROW_NUMBER() OVER(partition BY producto ORDER BY producto) AS rn,IDENTITY(INT,1,1) AS [ROW] INTO #temp FROM #mitabla
  49.  
  50.  
  51. /*"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:
  52. si el
  53. "Saldo"
  54. anterior es mayor a la Demanda actual es igual a 0 caso contrario,
  55. si la Demanda actual es menor a "Lote" muestra Lote si no muestra Demanda actual.
  56.  
  57.  
  58. "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
  59. */
  60.  
  61.  
  62. DECLARE @x INT
  63. DECLARE @disponible_nuevo INT
  64. DECLARE @saldo INT
  65. DECLARE @demanda INT
  66. DECLARE @rn INT
  67. DECLARE @necesidad INT
  68. DECLARE @saldo_ns INT
  69. SET @x=1
  70. SET @rn=1
  71. while @x<=(SELECT COUNT(*) FROM #temp)
  72. BEGIN
  73. SELECT @rn=rn FROM #temp WHERE [ROW]=@x
  74. IF @rn=1
  75.     BEGIN  
  76.         SELECT @necesidad=necesidad,@saldo=saldo FROM(
  77.         SELECT CASE WHEN Demanda<Lote THEN Lote ELSE Demanda END AS necesidad,saldo FROM #temp WHERE [ROW]=@x
  78.         ) AS t1
  79.  
  80.         SELECT @saldo_ns=@necesidad-demanda FROM #temp WHERE [ROW]=@x
  81.     END
  82. ELSE
  83. BEGIN
  84.     SELECT @necesidad=campo FROM(
  85.     SELECT CASE WHEN @saldo>demanda THEN 0
  86.     WHEN demanda<lote THEN lote ELSE demanda END  AS campo FROM #temp WHERE [ROW]=@x
  87.     ) AS t1
  88.  
  89.     SELECT @saldo_ns= @necesidad + @saldo - demanda FROM #temp WHERE [ROW]=@x
  90.     SELECT @saldo=saldo FROM #temp WHERE [ROW]=@x
  91. END
  92.  
  93. INSERT INTO #mitabla2
  94. SELECT producto,disponible,proceso,lote,periodo,requerido,disponiblenuevo,saldo,demanda,@necesidad,@saldo_ns FROM #temp WHERE [ROW]=@x
  95.  
  96. SET @x=@x+1
  97. END
  98.  
  99.  
  100.  
  101.  
  102. 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