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

Comparar una tabla registro por registro con otra

Estas en el tema de Comparar una tabla registro por registro con otra en el foro de SQL Server en Foros del Web. Hola compañeros, bueno tengo una duda que me ha estado llevando un par de días, ojala me puedan brindar de su ayuda, de antemano muchas ...
  #1 (permalink)  
Antiguo 12/12/2013, 09:39
Avatar de slaxsna  
Fecha de Ingreso: diciembre-2010
Ubicación: Tampico
Mensajes: 38
Antigüedad: 13 años, 4 meses
Puntos: 3
Comparar una tabla registro por registro con otra

Hola compañeros, bueno tengo una duda que me ha estado llevando un par de días, ojala me puedan brindar de su ayuda, de antemano muchas gracias.

Estoy creando una aplicación en c#, mando una lista de registros por así decirlo unos 50 registros mediante un SP con MSSQL 2008, los agrego a una tabla temporal, hasta ahí todo bien, lo que quiero es que esos N Registros compararlos con otra tabla, por ejemplo el primer registro de la tabla temporal buscarlo en otra tabla en el que debe de estar si o si y comparar un campo que es el de cantidad de descuento.

Ejemplo más detallado de la temporal

NOMBRE NoEmpleado CantidadDescuento Fecha
JOHN DOE 34234232 500.00 12/12/13

Debo realizar la búsqueda por número de empleado en la tabla master, pero puede estar repetido N veces en esa tabla, ya que es un sistema de pólizas, bueno, al recorrer la tabla master me topo con que JOHN DOE se encuentra pero el primer registro que encuentra tiene una cantidad de 250.00 entonces tiene que seguir buscando hasta encontrar otra póliza u otra, hasta que de la cantidad de 500.00, habrá registros que solo tengan una póliza y al encontrar el primero su cantidadDescuento será igual, bueno ya que haya recorrido cada uno de los registros, esos guardarlos en otra tabla en el ejemplo

NOMBRE POLIZA NoEmpleado CantidadDescuento
JOHN DOE 039838 34234232 250.00
JOHN DOE 039839 34234232 250.00
etc. etc.

Mi pregunta en si, como poder solucionarlo, si me pueden ir ayudando un poco se los agradecería.
  #2 (permalink)  
Antiguo 12/12/2013, 10:46
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: Comparar una tabla registro por registro con otra

eso podria ser algo asi

Código SQL:
Ver original
  1. CREATE TABLE #temp
  2. (
  3. nombre VARCHAR(20),
  4. cantidad INT
  5. )
  6.  
  7. INSERT INTO #temp VALUES ('yo',50)
  8. INSERT INTO #temp VALUES ('yo',50)
  9. INSERT INTO #temp VALUES ('tu',100)
  10. INSERT INTO #temp VALUES ('el',25)
  11. INSERT INTO #temp VALUES ('el',25)
  12. INSERT INTO #temp VALUES ('el',25)
  13. INSERT INTO #temp VALUES ('el',25)
  14. INSERT INTO #temp VALUES ('el',25)
  15.  
  16.  
  17. CREATE TABLE #resultado
  18. (
  19. nombre VARCHAR(20),
  20. cantidad INT
  21. )
  22.  
  23. DECLARE @x INT
  24. DECLARE @suma INT
  25. DECLARE @cantidad INT
  26. DECLARE @parametro VARCHAR(20)
  27. SET @x=1
  28. SET @suma=0
  29. SET @parametro='yo'
  30.  
  31. SELECT ROW_NUMBER() OVER(partition BY nombre ORDER BY nombre) AS rn, nombre,cantidad INTO #temp2 FROM #temp WHERE nombre=@parametro
  32.  
  33. while(@x<=(SELECT COUNT(*) FROM #temp2))
  34. BEGIN
  35. SELECT @cantidad=cantidad FROM #temp2 WHERE rn=@x
  36. SET @suma=@suma+@cantidad
  37. IF @suma<=100
  38. INSERT INTO #resultado SELECT nombre,cantidad FROM #temp2 WHERE rn=@x
  39. SET @x=@x+1
  40. END
  41.  
  42. SELECT * FROM #resultado
  43. DELETE FROM #resultado
  44. DROP TABLE #temp2

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 13/12/2013, 08:50
Avatar de slaxsna  
Fecha de Ingreso: diciembre-2010
Ubicación: Tampico
Mensajes: 38
Antigüedad: 13 años, 4 meses
Puntos: 3
Respuesta: Comparar una tabla registro por registro con otra

Muchas gracias @Libras, voy a probar ese código, yo lo estaba haciendo con un cursor, me recomiendas más de está forma que me comentas?


Gracias por tu valiosa ayuda.
  #4 (permalink)  
Antiguo 13/12/2013, 10:08
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: Comparar una tabla registro por registro con otra

definitivamente si, no es recomendado usar cursores por el consumo de memoria del mismo :)
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #5 (permalink)  
Antiguo 13/12/2013, 12:25
Avatar de slaxsna  
Fecha de Ingreso: diciembre-2010
Ubicación: Tampico
Mensajes: 38
Antigüedad: 13 años, 4 meses
Puntos: 3
Respuesta: Comparar una tabla registro por registro con otra

@Libras mira te comento, no he podido crearlo como tu me diste el ejemplo, sin embargo tengo un cursor que te comenté que estaba haciendo, quiero ver si me puedes ayudar un poco, ya que quede con cursor trataré de hacerlo sin cursor pero quisiera entender bien el problema que se me presenta,

Esto es lo que hago

Código SQL:
Ver original
  1. BEGIN
  2.   DECLARE @NEMPLEADO VARCHAR(20)
  3.     DECLARE @CANTIDAD DECIMAL(19,2)
  4.     DECLARE @QUINCENA VARCHAR(20)
  5.     DECLARE @descuento DECIMAL(19,2)
  6.     DECLARE @suma INT
  7.     DECLARE @x INT
  8.    
  9.     SET @descuento = 0
  10.     SET @suma = 0
  11.     SET @x = 1
  12.  
  13.     DECLARE EXPORT CURSOR FOR
  14.     SELECT nempleado, cantidad, quincena FROM info_retenedores
  15.     OPEN EXPORT
  16.     FETCH NEXT FROM EXPORT
  17.     INTO @NEMPLEADO, @CANTIDAD, @QUINCENA
  18.     WHILE @@FETCH_STATUS = 0
  19.         BEGIN
  20.             INSERT INTO exportaciones
  21.             SELECT SUBSTRING(@QUINCENA,1,4)+'-'+SUBSTRING(@QUINCENA,5,6), [EMISOR], SUBSTRING([POLIZA], CHARINDEX('-', [POLIZA]) + 1, LEN([POLIZA])),
  22.             [No EMPLEADO], [ASEGURADO], [CONTRATANTE], [DESC QNAL], [DEPENDENCIA]
  23.             FROM polizas WHERE [No EMPLEADO] = @NEMPLEADO AND LTRIM(RTRIM([No EMPLEADO])) != ''
  24.  
  25.             FETCH NEXT FROM EXPORT
  26.             INTO @NEMPLEADO, @CANTIDAD, @QUINCENA
  27.         END
  28.     CLOSE EXPORT
  29.     DEALLOCATE EXPORT
  30. END

Explicando lo que hago es, en otro stored procedure yo inserto unos registros en este caso 150 desde un archivo y los guardo en info_retenedores, después ejecuto este procedimiento, el cual va lee registro por registro de la tabla info_retenedores, después me interesan solo 3 campos de esa tabla, nempleado, cantidad, quincena los inserto en una tabla llamada exportaciones con otros datos que saco de una tabla master llamada polizas.

Hace lo que quiero pero no lo hace bien ya que al momento de meter los datos en exportaciones, mete todos los que encuentra en polizas y no debería ser así, ya que si en info_retenedores dice que fulanito se le descontaron 1100 pesos y en la tabla de polizas tiene 3 polizas: una de 500, otra de 600 y otra de 300, entonces si solo se le descontaron 1100 pesos que polizas tendría que solo seleccionar, en este caso sería la de 500 y la de 600 ya que la suma de ambas da la cantidad de descuento, sin embargo el proceso que hago me trae las 3 polizas, por que aún no hago operaciones, quisiera ver si me podrías echar la mano en esta situación, ya con mi ejemplo más real.

Muchas gracias de todas formas.
  #6 (permalink)  
Antiguo 13/12/2013, 12:33
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: Comparar una tabla registro por registro con otra

ya te dije como hacerlo adecua el codigo a tus necesidades....
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me

Etiquetas: campo, fecha, registro, tabla
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 22:00.