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

devolver la diferencia de valor entre una fila siguente

Estas en el tema de devolver la diferencia de valor entre una fila siguente en el foro de SQL Server en Foros del Web. Hola, puede alguien darme una manito con la siguiente consulta: tengo una tabla con 2 campos Debe, Haber de esos 2 campos sacare en un ...
  #1 (permalink)  
Antiguo 25/03/2014, 09:27
 
Fecha de Ingreso: marzo-2014
Mensajes: 5
Antigüedad: 10 años, 1 mes
Puntos: 0
Exclamación devolver la diferencia de valor entre una fila siguente

Hola, puede alguien darme una manito con la siguiente consulta:

tengo una tabla con 2 campos Debe, Haber de esos 2 campos sacare en un consulta
Un saldo.

El saldo lo calculo de la siguiente manera (debe-Haber)+saldo hasta ahi no hay problema mi problema es cuando calculo el saldo ya que tengo que sumar el saldo del registro anterior con el resultado del calculo del saldo del registro actual no se si me explique muy bien pero dejo un ejemplo para explicarme mejor

Debe | Haber | Saldo
1000 | 750 | 350
5000 |6500 | (5000-6500)+ 350 => (-1500) + 350 => -1150
760 |1000 | (760-1000) + (-1150)=>(-240) + (-1150) => -1390
10560 |5000 | (10560-5000) + (-1390) =>(5560)+(-1390)=> 4170
2300 |1560 | (2300-1560)+4170=>740 + 4170 => 4910


He buscado y hecho pruebas pero no logro dar con consultas similares y mi conocimiento de Sql es básico

Cualquier ayuda sera agradecida
  #2 (permalink)  
Antiguo 25/03/2014, 10:42
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: devolver la diferencia de valor entre una fila siguente

Código SQL:
Ver original
  1. CREATE TABLE #temp
  2. (
  3. debe INT,
  4. haber INT,
  5. saldo INT
  6. )
  7.  
  8.  
  9. CREATE TABLE #resultado
  10. (
  11. debe INT,
  12. haber INT,
  13. saldo INT,
  14. rn INT IDENTITY(1,1)
  15. )
  16.  
  17.  
  18. INSERT INTO #temp VALUES (1000,750,350)
  19. INSERT INTO #temp VALUES (5000,6500,NULL)
  20. INSERT INTO #temp VALUES (760 ,1000,NULL)
  21. INSERT INTO #temp VALUES (10560 ,5000,NULL)
  22. INSERT INTO #temp VALUES (2300 ,1560,NULL)
  23.  
  24. SELECT *, IDENTITY(INT,1,1) AS rn INTO #temp2 FROM #temp
  25.  
  26. DECLARE @x INT
  27. DECLARE @saldo INT
  28. DECLARE @suma INT
  29. SET @x=1
  30. SET @saldo=0
  31. while (@x<=(SELECT COUNT(*) FROM #temp2))
  32. BEGIN
  33. IF @x=1
  34. BEGIN
  35.     SELECT @saldo=saldo FROM #temp2 WHERE rn=@x
  36.     INSERT INTO #resultado
  37.         SELECT debe,haber, @saldo AS saldo FROM #temp2 WHERE rn=@x
  38. END
  39. ELSE
  40. BEGIN
  41.    
  42.     INSERT INTO #resultado
  43.         SELECT debe,haber,debe-haber + @saldo AS saldo FROM #temp2 WHERE rn=@x
  44.  
  45.     SELECT @saldo=saldo FROM #resultado WHERE rn=@x
  46.        
  47. END
  48. SET @x=@x+1
  49. END
  50.  
  51. SELECT * FROM #resultado

saludos!
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #3 (permalink)  
Antiguo 25/03/2014, 11:34
 
Fecha de Ingreso: marzo-2014
Mensajes: 5
Antigüedad: 10 años, 1 mes
Puntos: 0
Respuesta: devolver la diferencia de valor entre una fila siguente

Ok talves no me di a entender muy bien en la tabla solo tengo 2 campos que seran Debe y Haber el campo saldo es el q yo quiero q la consulta me devuelva. lo que yo intente hacer y q me funciono a medias es el Lag

select Debe,Haber, (Debe-Haber)+(Lag(Debe-Haber,1,0)) as Saldo Over (Orde By(Id)) eso me funciona al realizar la suma del saldo el unico problema es q como saldo no es parte de la tabla si no algo calculado al hacer la resta no me la hace completamente a lo q me refiero es a lo siguiente:

digamos q obtuve el resultado de la consulta y me dio el siguiente resultado:

Debe | Haber | Saldo

100 | 50 | 50
30 | 40 | 30 => aqui me da la respuesta correcta
150 | 75 | 65 => aqui unicamente me hace la resta del debe y el Haber de la fila anterior no del saldo anterior

Es ahi donde el codigo ya no hace lo que realmente necesito
  #4 (permalink)  
Antiguo 25/03/2014, 12:01
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: devolver la diferencia de valor entre una fila siguente

Código SQL:
Ver original
  1. CREATE TABLE #temp
  2. (
  3. debe INT,
  4. haber INT
  5. )
  6.  
  7.  
  8. CREATE TABLE #resultado
  9. (
  10. debe INT,
  11. haber INT,
  12. saldo INT,
  13. rn INT IDENTITY(1,1)
  14. )
  15.  
  16.  
  17. INSERT INTO #temp VALUES (1000,750)
  18. INSERT INTO #temp VALUES (5000,6500)
  19. INSERT INTO #temp VALUES (760 ,1000)
  20. INSERT INTO #temp VALUES (10560 ,5000)
  21. INSERT INTO #temp VALUES (2300 ,1560)
  22.  
  23. SELECT *, IDENTITY(INT,1,1) AS rn INTO #temp2 FROM #temp
  24.  
  25. DECLARE @x INT
  26. DECLARE @saldo INT
  27. DECLARE @suma INT
  28. SET @x=1
  29. SET @saldo=0
  30. while (@x<=(SELECT COUNT(*) FROM #temp2))
  31. BEGIN
  32.    
  33.     INSERT INTO #resultado
  34.         SELECT debe,haber,debe-haber + @saldo AS saldo FROM #temp2 WHERE rn=@x
  35.  
  36.     SELECT @saldo=saldo FROM #resultado WHERE rn=@x
  37.        
  38. SET @x=@x+1
  39. END
  40.  
  41.  
  42. SELECT * FROM #resultado

lo mismo, con un solo query no puedes obtener lo que necesitas ya que ocupas los acumulados....
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me

Etiquetas: consultasql, 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:37.