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

[SOLUCIONADO] Calculo de Columnas

Estas en el tema de Calculo de Columnas en el foro de SQL Server en Foros del Web. Buenas tardes, tal ves puedan ayudarme con la consulta siguiente: tengo productos con datos fijos.. stock disponible, en proceso de fabricación, cantidad por lote fabricado, ...
  #1 (permalink)  
Antiguo 14/08/2014, 15:46
 
Fecha de Ingreso: agosto-2014
Mensajes: 17
Antigüedad: 9 años, 8 meses
Puntos: 0
Calculo de Columnas

Buenas tardes, tal ves puedan ayudarme con la consulta siguiente: tengo productos con datos fijos.. stock disponible, en proceso de fabricación, cantidad por lote fabricado, y también datos como periodo de requerimiento, cantidad requerida de fabricación y tres columnas vacías..
"DisponibleNuevo" la primera ves es igual al Disponible del producto, en adelante sera igual al "saldo" si es negativo se muestra su valor absoluto sino será 0
"saldo" siempre es igual a (Requerido - DisponibleNuevo - Proceso),
"demanda" siempre es igual a "saldo" (si es negativo se iguala a 0)
Copio el código de la tabla primero con registros de datos y las columnas a calcular vacías,
y segundo los registros de datos comentados con el resultado final como debería quedar.

Gracias de antemano por su ayuda.
Código SQL:
Ver original
  1. CREATE TABLE MiTabla(
  2. Producto VARCHAR(04),
  3. Disponible NUMERIC(16,8),
  4. Proceso NUMERIC(16,8),
  5. Lote NUMERIC(16,8),
  6. Periodo INT,
  7. Requerido NUMERIC(16,8),
  8. DisponibleNuevo NUMERIC(16,8),
  9. Saldo NUMERIC(16,8),
  10. Demanda NUMERIC(16,8)
  11. )
  12. GO
  13.  
  14. INSERT INTO MiTabla(Producto, Disponible, Proceso, Lote, Periodo, Requerido, DisponibleNuevo, Saldo, Demanda) VALUES('1001',200,20,1000,201406,150,0,0,0)
  15. INSERT INTO MiTabla(Producto, Disponible, Proceso, Lote, Periodo, Requerido, DisponibleNuevo, Saldo, Demanda) VALUES('1001',200,20,1000,201407,100,0,0,0)
  16. INSERT INTO MiTabla(Producto, Disponible, Proceso, Lote, Periodo, Requerido, DisponibleNuevo, Saldo, Demanda) VALUES('1001',200,20,1000,201408,120,0,0,0)
  17. INSERT INTO MiTabla(Producto, Disponible, Proceso, Lote, Periodo, Requerido, DisponibleNuevo, Saldo, Demanda) VALUES('1001',200,20,1000,201409,80,0,0,0)
  18. INSERT INTO MiTabla(Producto, Disponible, Proceso, Lote, Periodo, Requerido, DisponibleNuevo, Saldo, Demanda) VALUES('1001',200,20,1000,201410,25,0,0,0)
  19. INSERT INTO MiTabla(Producto, Disponible, Proceso, Lote, Periodo, Requerido, DisponibleNuevo, Saldo, Demanda) VALUES('1001',200,20,1000,201411,150,0,0,0)
  20. INSERT INTO MiTabla(Producto, Disponible, Proceso, Lote, Periodo, Requerido, DisponibleNuevo, Saldo, Demanda) VALUES('1001',200,20,1000,201412,300,0,0,0)
  21. INSERT INTO MiTabla(Producto, Disponible, Proceso, Lote, Periodo, Requerido, DisponibleNuevo, Saldo, Demanda) VALUES('1002',100,80,500,201501,50,0,0,0)
  22. INSERT INTO MiTabla(Producto, Disponible, Proceso, Lote, Periodo, Requerido, DisponibleNuevo, Saldo, Demanda) VALUES('1002',100,80,500,201501,30,0,0,0)
  23. INSERT INTO MiTabla(Producto, Disponible, Proceso, Lote, Periodo, Requerido, DisponibleNuevo, Saldo, Demanda) VALUES('1002',100,80,500,201502,65,0,0,0)
  24.  
  25. --INSERT INTO MiTabla(Producto, Disponible, Proceso, Lote, Periodo, Requerido, DisponibleNuevo, Saldo, Demanda) VALUES('1001',200,20,1000,201406,150,200,-70,0)
  26. --INSERT INTO MiTabla(Producto, Disponible, Proceso, Lote, Periodo, Requerido, DisponibleNuevo, Saldo, Demanda) VALUES('1001',200,20,1000,201407,100,70,30,30)
  27. --INSERT INTO MiTabla(Producto, Disponible, Proceso, Lote, Periodo, Requerido, DisponibleNuevo, Saldo, Demanda) VALUES('1001',200,20,1000,201408,120,0,120,120)
  28. --INSERT INTO MiTabla(Producto, Disponible, Proceso, Lote, Periodo, Requerido, DisponibleNuevo, Saldo, Demanda) VALUES('1001',200,20,1000,201409,80,0,80,80)
  29. --INSERT INTO MiTabla(Producto, Disponible, Proceso, Lote, Periodo, Requerido, DisponibleNuevo, Saldo, Demanda) VALUES('1001',200,20,1000,201410,25,0,25,25)
  30. --INSERT INTO MiTabla(Producto, Disponible, Proceso, Lote, Periodo, Requerido, DisponibleNuevo, Saldo, Demanda) VALUES('1001',200,20,1000,201411,150,0,150,150)
  31. --INSERT INTO MiTabla(Producto, Disponible, Proceso, Lote, Periodo, Requerido, DisponibleNuevo, Saldo, Demanda) VALUES('1001',200,20,1000,201412,300,0,300,300)
  32. --INSERT INTO MiTabla(Producto, Disponible, Proceso, Lote, Periodo, Requerido, DisponibleNuevo, Saldo, Demanda) VALUES('1002',100,80,500,201406,50,100,-130,0)
  33. --INSERT INTO MiTabla(Producto, Disponible, Proceso, Lote, Periodo, Requerido, DisponibleNuevo, Saldo, Demanda) VALUES('1002',100,80,500,201407,30,130,-100,0)
  34. --INSERT INTO MiTabla(Producto, Disponible, Proceso, Lote, Periodo, Requerido, DisponibleNuevo, Saldo, Demanda) VALUES('1002',100,80,500,201408,65,100,-35,0)
  35. --INSERT INTO MiTabla(Producto, Disponible, Proceso, Lote, Periodo, Requerido, DisponibleNuevo, Saldo, Demanda) VALUES('1002',100,80,500,201409,85,35,50,50)

Última edición por gnzsoloyo; 15/08/2014 a las 09:05
  #2 (permalink)  
Antiguo 14/08/2014, 16:32
Avatar de 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. CREATE TABLE #mitabla(
  2. Producto VARCHAR(04),
  3. Disponible NUMERIC(16,8),
  4. Proceso NUMERIC(16,8),
  5. Lote NUMERIC(16,8),
  6. Periodo INT,
  7. Requerido NUMERIC(16,8),
  8. DisponibleNuevo NUMERIC(16,8),
  9. Saldo NUMERIC(16,8),
  10. Demanda NUMERIC(16,8)
  11. )
  12. GO
  13. CREATE TABLE #mitabla2(
  14. Producto VARCHAR(04),
  15. Disponible NUMERIC(16,8),
  16. Proceso NUMERIC(16,8),
  17. Lote NUMERIC(16,8),
  18. Periodo INT,
  19. Requerido NUMERIC(16,8),
  20. DisponibleNuevo NUMERIC(16,8),
  21. Saldo NUMERIC(16,8),
  22. Demanda NUMERIC(16,8)
  23. )
  24. GO
  25.  
  26. INSERT INTO #mitabla(Producto, Disponible, Proceso, Lote, Periodo, Requerido, DisponibleNuevo, Saldo, Demanda) VALUES('1001',200,20,1000,201406,150,0,0,0)
  27. INSERT INTO #mitabla(Producto, Disponible, Proceso, Lote, Periodo, Requerido, DisponibleNuevo, Saldo, Demanda) VALUES('1001',200,20,1000,201407,100,0,0,0)
  28. INSERT INTO #mitabla(Producto, Disponible, Proceso, Lote, Periodo, Requerido, DisponibleNuevo, Saldo, Demanda) VALUES('1001',200,20,1000,201408,120,0,0,0)
  29. INSERT INTO #mitabla(Producto, Disponible, Proceso, Lote, Periodo, Requerido, DisponibleNuevo, Saldo, Demanda) VALUES('1001',200,20,1000,201409,80,0,0,0)
  30. INSERT INTO #mitabla(Producto, Disponible, Proceso, Lote, Periodo, Requerido, DisponibleNuevo, Saldo, Demanda) VALUES('1001',200,20,1000,201410,25,0,0,0)
  31. INSERT INTO #mitabla(Producto, Disponible, Proceso, Lote, Periodo, Requerido, DisponibleNuevo, Saldo, Demanda) VALUES('1001',200,20,1000,201411,150,0,0,0)
  32. INSERT INTO #mitabla(Producto, Disponible, Proceso, Lote, Periodo, Requerido, DisponibleNuevo, Saldo, Demanda) VALUES('1001',200,20,1000,201412,300,0,0,0)
  33. INSERT INTO #mitabla(Producto, Disponible, Proceso, Lote, Periodo, Requerido, DisponibleNuevo, Saldo, Demanda) VALUES('1002',100,80,500,201501,50,0,0,0)
  34. INSERT INTO #mitabla(Producto, Disponible, Proceso, Lote, Periodo, Requerido, DisponibleNuevo, Saldo, Demanda) VALUES('1002',100,80,500,201501,30,0,0,0)
  35. INSERT INTO #mitabla(Producto, Disponible, Proceso, Lote, Periodo, Requerido, DisponibleNuevo, Saldo, Demanda) VALUES('1002',100,80,500,201502,65,0,0,0)
  36.  
  37.  
  38. SELECT *,ROW_NUMBER() OVER(partition BY producto ORDER BY producto) AS rn,IDENTITY(INT,1,1) AS [ROW] INTO #temp FROM #mitabla
  39.  
  40. DECLARE @x INT
  41. DECLARE @disponible_nuevo INT
  42. DECLARE @saldo INT
  43. DECLARE @demanda INT
  44. DECLARE @rn INT
  45. SET @x=1
  46. SET @rn=1
  47. while @x<=(SELECT COUNT(*) FROM #temp)
  48. BEGIN
  49. SELECT @rn=rn FROM #temp WHERE [ROW]=@x
  50. IF @rn=1
  51.     SELECT @disponible_nuevo=disponible FROM #temp WHERE [ROW]=@x
  52. ELSE
  53. BEGIN
  54.     IF @saldo<0
  55.       SET @saldo=@saldo*-1
  56.     ELSE
  57.       SET @saldo=0
  58.     SET @disponible_nuevo=@saldo
  59. END
  60.  
  61.  
  62.  
  63.  
  64. SELECT @saldo=requerido-@disponible_nuevo-proceso FROM #temp WHERE [ROW]=@x
  65. IF @saldo<0
  66.   SET @demanda=0
  67. ELSE
  68.   SET @demanda=@saldo  
  69.  
  70. INSERT INTO #mitabla2
  71. SELECT producto,disponible,proceso,lote,periodo,requerido,@disponible_nuevo,@saldo,@demanda FROM #temp WHERE [ROW]=@x
  72.  
  73. SET @x=@x+1
  74. END
  75.  
  76. SELECT * FROM #mitabla2
  77. DELETE FROM #mitabla2
  78.  
  79. DROP TABLE #temp

Hay un error en tus calculos en el segundo renglon deberia ser en la columna saldo y demanda 10 y tu tienes 30, te falto restar proceso ;)
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #3 (permalink)  
Antiguo 14/08/2014, 17:07
 
Fecha de Ingreso: agosto-2014
Mensajes: 17
Antigüedad: 9 años, 8 meses
Puntos: 0
Respuesta: Calculo de Columnas

Muchas gracias Libras!! me ayudaste un montón, con respecto al calculo en el que se resta la columna proceso la he corregido debido que obvie un dato adicional (en este caso debe restar solo cuando @rn=1), esa línea quedaría de la siguiente manera..

select @saldo=requerido-@disponible_nuevo-(case when @rn=1 then proceso else 0 end) from #temp where [row]=@x

De igual manera me ayudaste bastante muchas gracias.

Saludos!
  #4 (permalink)  
Antiguo 14/08/2014, 18:17
 
Fecha de Ingreso: agosto-2014
Mensajes: 17
Antigüedad: 9 años, 8 meses
Puntos: 0
Respuesta: Calculo de Columnas

Libras una consulta adicional prometo que será la ultima!!, partiendo de la data final que se obtiene en la tabla debo calcular dos columnas adicionales..
"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

Copio el código de la tabla primero con registros de datos y las columnas a calcular vacías,
y segundo los registros de datos comentados con el resultado final como debería quedar.

Gracias de antemano por su ayuda.


Código SQL:
Ver original
  1. CREATE TABLE #mitabla(
  2. Producto VARCHAR(04),
  3. Disponible NUMERIC(16,8),
  4. Proceso NUMERIC(16,8),
  5. Lote NUMERIC(16,8),
  6. Periodo INT,
  7. Requerido NUMERIC(16,8),
  8. DisponibleNuevo NUMERIC(16,8),
  9. Saldo NUMERIC(16,8),
  10. Demanda NUMERIC(16,8),
  11.  
  12. Necesidad NUMERIC(16,8),
  13. Saldo_ns NUMERIC(16,8)
  14.  
  15. )
  16.  
  17. 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)
  18. 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)
  19. 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)
  20. 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)
  21. 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)
  22. 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)
  23. 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)
  24. 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)
  25. 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)
  26. 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)
  27.  
  28. --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,1000,1000)
  29. --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,970)
  30. --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,850)
  31. --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,770)
  32. --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,745)
  33. --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,595)
  34. --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,295)
  35. --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,500,500)
  36. --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,430)
  37. --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,310)

Última edición por gnzsoloyo; 15/08/2014 a las 09:05
  #5 (permalink)  
Antiguo 14/08/2014, 22:57
Avatar de 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

Cita:
Iniciado por ceqn_20 Ver Mensaje
Muchas gracias Libras!! me ayudaste un montón, con respecto al calculo en el que se resta la columna proceso la he corregido debido que obvie un dato adicional (en este caso debe restar solo cuando @rn=1), esa línea quedaría de la siguiente manera..

select @saldo=requerido-@disponible_nuevo-(case when @rn=1 then proceso else 0 end) from #temp where [row]=@x

De igual manera me ayudaste bastante muchas gracias.

Saludos!
Obviaste un dato adicional??? es obvio para ti pero no para mi que no tengo todo el background de tu problema :P....por eso luego dicen que no se resuelven bien las dudas jejejejeje :P
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #6 (permalink)  
Antiguo 15/08/2014, 08:07
 
Fecha de Ingreso: agosto-2014
Mensajes: 17
Antigüedad: 9 años, 8 meses
Puntos: 0
Respuesta: Calculo de Columnas

Gracias Libras!, espero puedas ayudarme con la ultima consulta que te mencione.


Saludos,
  #7 (permalink)  
Antiguo 15/08/2014, 09:26
Avatar de 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
  #8 (permalink)  
Antiguo 15/08/2014, 10:10
 
Fecha de Ingreso: agosto-2014
Mensajes: 17
Antigüedad: 9 años, 8 meses
Puntos: 0
Respuesta: Calculo de Columnas

Libras te pido disculpas tuve un error al escribir las condiciones. (las diferencias lo he marcado en negrita cursiva)

"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_ns" 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_ns" anterior menos(-) "Demanda" actual

Para el caso de la segunda necesidad se cumple "en adelante será igual a:"
(saldo_ns anterior) 1000 > 30 (demanda actual) VERDADERO muestra 0
  #9 (permalink)  
Antiguo 15/08/2014, 10:28
Avatar de 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

ps ya te di como hacerlo ahora pon algo de tu parte.....
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #10 (permalink)  
Antiguo 15/08/2014, 11:11
 
Fecha de Ingreso: agosto-2014
Mensajes: 17
Antigüedad: 9 años, 8 meses
Puntos: 0
Respuesta: Calculo de Columnas

Gracias libras.. he revisado y al parecer lo he logrado, he remplazado las líneas:

SELECT CASE WHEN @saldo>demanda THEN 0
por
SELECT CASE WHEN @saldo_ns>demanda THEN 0

SELECT @saldo_ns= @necesidad + @saldo - demanda FROM #temp WHERE [ROW]=@x
por
SELECT @saldo_ns= @necesidad + @saldo_ns - demanda FROM #temp WHERE [ROW]=@x

Etiquetas: calculo, columna, query, server, sql
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 09:23.