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

Cursor para ordenar datos horizontalmente

Estas en el tema de Cursor para ordenar datos horizontalmente en el foro de SQL Server en Foros del Web. Hola a todos les cuento mi problema, trabajo con dos tablas, la tabla prueba y la tabla libro. Para que es quede mas claro, a ...
  #1 (permalink)  
Antiguo 28/12/2012, 14:04
 
Fecha de Ingreso: diciembre-2012
Mensajes: 83
Antigüedad: 12 años
Puntos: 4
Pregunta Cursor para ordenar datos horizontalmente

Hola a todos les cuento mi problema, trabajo con dos tablas, la tabla prueba y la tabla libro. Para que es quede mas claro, a tabla prueba tiene el campo llamado "rut" que es un identificador y un campo llamado "telcontacto" que son números telefónicos. la tabla libro tiene los campos del identificador "rut" y los teléfonos del 1 al 20.

Tabla Prueba
origen varchar(15)
rut decimal(9)
telconsolidado char(18)
fecha datetime(8)

Tabla Libro
rut nvarchar(50)
fono1 nvarchar(50)
fono2 nvarchar(50)
...
fono20 nvarchar(50)

En la tabla prueba pueden haber rut que tengan mas de un teléfono, hasta 10 casi siempre, y lo que necesito hacer es tomar el rut y el telñefono de la tabla prueba y guardarlos en la tabla libro, perooo guardar solo un campo rut e incluirle los telefonos hacia la derecha, por ejemplo si tenemos los siguientes datos

rut fono
123 25632
123 25874
254 1254
586 1257

Esto debería quedar asi en la tabla libro:

rut fono1 fono2..... fono20
123 25632 25874
254 1254
586 1257

Ahora bien, para hacer esto la mejor solución que pense es un cursor el que les dejo a continuación para que me digan donde me estoy equivocando porque lo ejecuto, pero no me guarda ningun dato en la tabla libro, algun consejo por favor? gracias :)




-- Declaracion de variables para el cursor
DECLARE @rut decimal,
@fono char(18)

-- Declaración del cursor
DECLARE Fono CURSOR FOR
SELECT rut, telconsolidado FROM prueba

-- Apertura del cursor
OPEN Fono

-- Lectura de la primera fila del cursor
FETCH Fono INTO @rut, @fono
WHILE (@@FETCH_STATUS = 0 )
BEGIN
select rut from prueba where rut = @rut
if @@rowcount = 0
insert into libro (rut, fono1) values (@rut, @fono)
else
begin
select fono2 from libro where rut = @rut and fono2 > 0
if @@rowcount = 0
update libro set fono2 = @fono where rut = @rut
else
begin
select fono3 from libro where rut = @rut and fono3 > 0
if @@rowcount = 0
update libro set fono3 = @fono where rut = @rut
else
begin
select fono4 from libro where rut = @rut and fono4 > 0
if @@rowcount = 0
update libro set fono4 = @fono where rut = @rut
else
begin
select fono5 from libro where rut = @rut and fono5 > 0
if @@rowcount = 0
update libro set fono5 = @fono where rut = @rut
else
begin
select fono6 from libro where rut = @rut and fono6 > 0
if @@rowcount = 0
update libro set fono6 = @fono where rut = @rut
else
begin
select fono7 from libro where rut = @rut and fono7 > 0
if @@rowcount = 0
update libro set fono7 = @fono where rut = @rut
else
begin
select fono8 from libro where rut = @rut and fono8 > 0
if @@rowcount = 0
update libro set fono8 = @fono where rut = @rut
else
begin
select fono9 from libro where rut = @rut and fono9 > 0
if @@rowcount = 0
update libro set fono9 = @fono where rut = @rut
else
begin
select fono10 from libro where rut = @rut and fono10 > 0
if @@rowcount = 0
update libro set fono10 = @fono where rut = @rut
else
begin
select fono11 from libro where rut = @rut and fono11 > 0
if @@rowcount = 0
update libro set fono11 = @fono where rut = @rut
else
begin
select fono12 from libro where rut = @rut and fono12 > 0
if @@rowcount = 0
update libro set fono12 = @fono where rut = @rut
else
begin
select fono13 from libro where rut = @rut and fono13 > 0
if @@rowcount = 0
update libro set fono13 = @fono where rut = @rut
else
begin
select fono14 from libro where rut = @rut and fono14 > 0
if @@rowcount = 0
update libro set fono14 = @fono where rut = @rut
else
begin
select fono15 from libro where rut = @rut and fono15 > 0
if @@rowcount = 0
update libro set fono15 = @fono where rut = @rut
else
begin
select fono16 from libro where rut = @rut and fono16 > 0
if @@rowcount = 0
update libro set fono16 = @fono where rut = @rut
else
begin
select fono17 from libro where rut = @rut and fono17 > 0
if @@rowcount = 0
update libro set fono17 = @fono where rut = @rut
else
begin
select fono18 from libro where rut = @rut and fono18 > 0
if @@rowcount = 0
update libro set fono18 = @fono where rut = @rut
else
begin
select fono19 from libro where rut = @rut and fono19 > 0
if @@rowcount = 0
update libro set fono19 = @fono where rut = @rut
else
update libro set fono20 = @fono where rut = @rut
end
end
end
end
end
end
end
end
end
end
end
end
end
end
end
end
end
end
FETCH Fono INTO @rut, @fono
END

-- Cierre del cursor
CLOSE Fono

-- Liberar los recursos
DEALLOCATE Fono
  #2 (permalink)  
Antiguo 28/12/2012, 14:31
 
Fecha de Ingreso: diciembre-2012
Mensajes: 83
Antigüedad: 12 años
Puntos: 4
Respuesta: Cursor para ordenar datos horizontalmente

Disculpen pero ya encontre la respuesta, estaba en este trozo de código en el primer BEGIN
BEGIN
select rut from prueba where rut = @rut

estaba mal direccionado el select, debia solamente hacerlo a la tabla libro en vez de la tabla prueba, creo que pedi ayuda sin haberme esforzado lo suficiente, pero gracias, analize mas el código gracias a eso :) saludos
  #3 (permalink)  
Antiguo 28/12/2012, 14:48
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 4 meses
Puntos: 774
Respuesta: Cursor para ordenar datos horizontalmente

sin cursores y con querys dinamicos :)

Código SQL:
Ver original
  1. CREATE TABLE #temp(
  2. rut INT,
  3. fono INT
  4. )
  5.  
  6. INSERT INTO #temp VALUES (123,25632)
  7. INSERT INTO #temp VALUES (123,25874)
  8. INSERT INTO #temp VALUES (123,22222)
  9. INSERT INTO #temp VALUES (123,11111)
  10. INSERT INTO #temp VALUES (123,33333)
  11. INSERT INTO #temp VALUES (123,55555)
  12. INSERT INTO #temp VALUES (123,66666)
  13. INSERT INTO #temp VALUES (123,77777)
  14. INSERT INTO #temp VALUES (123,88888)
  15. INSERT INTO #temp VALUES (254,1254)
  16. INSERT INTO #temp VALUES (586,1257)
  17.  
  18.  
  19. DECLARE @TABLE nvarchar(MAX)
  20. DECLARE @x INT
  21. DECLARE @y INT
  22. DECLARE @query nvarchar(MAX)
  23. DECLARE @fono INT
  24. DECLARE @rut INT
  25. DECLARE @z INT
  26.  
  27. SELECT @x=MAX(total) FROM(
  28. SELECT COUNT(rut) total FROM #temp GROUP BY rut
  29. ) t1
  30.  
  31. SET @y=1
  32. SET @TABLE='create table ##temp2 (rut int,'
  33. while @y<=@x
  34. BEGIN
  35. IF @y=@x
  36. SET @TABLE=@TABLE + 'fono' + CONVERT(VARCHAR(10),@y) + ' int)'
  37. ELSE
  38. SET @TABLE=@TABLE + 'fono' + CONVERT(VARCHAR(10),@y) + ' int,'
  39. SET @y=@y+1
  40. END
  41. EXECUTE sp_executesql @TABLE
  42.  
  43.  
  44.  
  45. SELECT rut,IDENTITY(INT,1,1) rn INTO #temp3 FROM #temp GROUP BY rut
  46. SET @x=1
  47.  
  48. while @x<=(SELECT COUNT(*) FROM #temp3)
  49. BEGIN
  50. SELECT @rut=rut FROM #temp3 WHERE rn=@x
  51.     SET @y=1
  52.     SET @z=1   
  53.     SET @query='insert into ##temp2 (rut,'
  54.     SELECT fono,IDENTITY(INT,1,1) rn INTO #temp4 FROM #temp WHERE rut=@rut
  55.    
  56.     while @z<=(SELECT COUNT(*) FROM #temp WHERE rut=@rut)
  57.     BEGIN
  58.         IF @z=(SELECT COUNT(*) FROM #temp WHERE rut=@rut)
  59.         SET @query=@query + 'fono' + CONVERT(VARCHAR(10),@z) + ')'
  60.         ELSE
  61.         SET @query=@query + 'fono' + CONVERT(VARCHAR(10),@z) + ','
  62.         SET @z=@z+1
  63.     END
  64.     SET @query=@query + ' values (' + CONVERT(VARCHAR(10),@rut) + ','
  65.     print @query
  66.     while @y<=(SELECT COUNT(*) FROM #temp WHERE rut=@rut)
  67.     BEGIN
  68.        IF @y=(SELECT COUNT(*) FROM #temp WHERE rut=@rut)           
  69.         SET @query=@query + CONVERT(VARCHAR(10),(SELECT fono FROM #temp4 WHERE rn=@y)) + ')'
  70.        ELSE
  71.         SET @query=@query + CONVERT(VARCHAR(10),(SELECT fono FROM #temp4 WHERE rn=@y)) + ','           
  72.         SET @y=@y+1
  73.     END
  74.     DROP TABLE #temp4
  75.     EXECUTE sp_executesql @query
  76. SET @x=@x+1
  77. END
  78. SELECT * FROM ##temp2
  79. DROP TABLE ##temp2
  80. DROP TABLE #temp3
  81. --drop table #temp4
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #4 (permalink)  
Antiguo 29/12/2012, 12:14
 
Fecha de Ingreso: julio-2012
Ubicación: Israel
Mensajes: 360
Antigüedad: 12 años, 5 meses
Puntos: 40
Respuesta: Cursor para ordenar datos horizontalmente

Esta es mi contribución:
Código SQL:
Ver original
  1. WITH T AS
  2. (SELECT ROW_NUMBER() OVER(Partition BY rut ORDER BY fono) Nm,
  3.         *
  4. FROM    #temp)
  5. SELECT  rut,
  6.         MAX(CASE WHEN Nm=1 THEN fono END) [01],
  7.         MAX(CASE WHEN Nm=2 THEN fono END) [02],
  8.         MAX(CASE WHEN Nm=3 THEN fono END) [03],
  9.         MAX(CASE WHEN Nm=4 THEN fono END) [04],
  10.         MAX(CASE WHEN Nm=5 THEN fono END) [05],
  11.         MAX(CASE WHEN Nm=6 THEN fono END) [06],
  12.         MAX(CASE WHEN Nm=7 THEN fono END) [07],
  13.         MAX(CASE WHEN Nm=8 THEN fono END) [08],
  14.         MAX(CASE WHEN Nm=9 THEN fono END) [09],
  15.         MAX(CASE WHEN Nm=10 THEN fono END) [10],
  16.         MAX(CASE WHEN Nm=11 THEN fono END) [11],
  17.         MAX(CASE WHEN Nm=12 THEN fono END) [12],
  18.         MAX(CASE WHEN Nm=13 THEN fono END) [13],
  19.         MAX(CASE WHEN Nm=14 THEN fono END) [14],
  20.         MAX(CASE WHEN Nm=15 THEN fono END) [15],
  21.         MAX(CASE WHEN Nm=16 THEN fono END) [16],
  22.         MAX(CASE WHEN Nm=17 THEN fono END) [17],
  23.         MAX(CASE WHEN Nm=18 THEN fono END) [18],
  24.         MAX(CASE WHEN Nm=19 THEN fono END) [19],
  25.         MAX(CASE WHEN Nm=20 THEN fono END) [20]
  26. FROM    T
  27. GROUP BY rut
  28. ORDER BY rut;
__________________
El Castellano no es mi lengua materna: discúlpenme por los errores gramaticales.
Mi blog
  #5 (permalink)  
Antiguo 31/12/2012, 06:16
 
Fecha de Ingreso: diciembre-2012
Mensajes: 83
Antigüedad: 12 años
Puntos: 4
Respuesta: Cursor para ordenar datos horizontalmente

Mil gracias por el código, aqui todos los dias se aprende algo nuevo ;)
  #6 (permalink)  
Antiguo 31/12/2012, 09:10
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 4 meses
Puntos: 774
Respuesta: Cursor para ordenar datos horizontalmente

Cita:
Iniciado por GeriReshef Ver Mensaje
Esta es mi contribución:
Código SQL:
Ver original
  1. WITH T AS
  2. (SELECT ROW_NUMBER() OVER(Partition BY rut ORDER BY fono) Nm,
  3.         *
  4. FROM    #temp)
  5. SELECT  rut,
  6.         MAX(CASE WHEN Nm=1 THEN fono END) [01],
  7.         MAX(CASE WHEN Nm=2 THEN fono END) [02],
  8.         MAX(CASE WHEN Nm=3 THEN fono END) [03],
  9.         MAX(CASE WHEN Nm=4 THEN fono END) [04],
  10.         MAX(CASE WHEN Nm=5 THEN fono END) [05],
  11.         MAX(CASE WHEN Nm=6 THEN fono END) [06],
  12.         MAX(CASE WHEN Nm=7 THEN fono END) [07],
  13.         MAX(CASE WHEN Nm=8 THEN fono END) [08],
  14.         MAX(CASE WHEN Nm=9 THEN fono END) [09],
  15.         MAX(CASE WHEN Nm=10 THEN fono END) [10],
  16.         MAX(CASE WHEN Nm=11 THEN fono END) [11],
  17.         MAX(CASE WHEN Nm=12 THEN fono END) [12],
  18.         MAX(CASE WHEN Nm=13 THEN fono END) [13],
  19.         MAX(CASE WHEN Nm=14 THEN fono END) [14],
  20.         MAX(CASE WHEN Nm=15 THEN fono END) [15],
  21.         MAX(CASE WHEN Nm=16 THEN fono END) [16],
  22.         MAX(CASE WHEN Nm=17 THEN fono END) [17],
  23.         MAX(CASE WHEN Nm=18 THEN fono END) [18],
  24.         MAX(CASE WHEN Nm=19 THEN fono END) [19],
  25.         MAX(CASE WHEN Nm=20 THEN fono END) [20]
  26. FROM    T
  27. GROUP BY rut
  28. ORDER BY rut;
Esta bien la idea jejeje, pero el mio es para N valores jejejeje saludos y feliz año :)
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #7 (permalink)  
Antiguo 31/12/2012, 12:39
 
Fecha de Ingreso: julio-2012
Ubicación: Israel
Mensajes: 360
Antigüedad: 12 años, 5 meses
Puntos: 40
Libras: esto es para ti

Código SQL:
Ver original
  1. DECLARE @SQL VARCHAR(MAX);
  2. WITH T AS
  3. (SELECT ROW_NUMBER() OVER(Partition BY rut ORDER BY fono) Nm,
  4.         *
  5. FROM    #temp),
  6. Numeros AS
  7. (SELECT DISTINCT Nm
  8. FROM    T)
  9. SELECT  @SQL=IsNull(@SQL+','+CHAR(13),'')+'     Max(Case When Nm='+CAST(Nm AS VARCHAR)+' Then fono End) ['+CAST(Nm AS VARCHAR)+']'
  10. FROM    Numeros;
  11. SELECT  @SQL=
  12. 'With T As
  13. (Select Row_Number() Over(Partition By rut Order By fono) Nm,
  14.         *
  15. From    #temp)
  16. Select  rut,'+CHAR(13)+
  17. +@SQL+CHAR(13)+
  18. 'From   T
  19. Group By rut
  20. Order By rut;'
  21. Print   @SQL;
  22. EXEC(@SQL);
  23. SELECT  CAST(0x460065006C0069007A0020006100F1006F0020006E007500650076006F00 AS NVarchar);
__________________
El Castellano no es mi lengua materna: discúlpenme por los errores gramaticales.
Mi blog
  #8 (permalink)  
Antiguo 31/12/2012, 13:38
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 4 meses
Puntos: 774
Respuesta: Libras: esto es para ti

Cita:
Iniciado por GeriReshef Ver Mensaje
Código SQL:
Ver original
  1. DECLARE @SQL VARCHAR(MAX);
  2. WITH T AS
  3. (SELECT ROW_NUMBER() OVER(Partition BY rut ORDER BY fono) Nm,
  4.         *
  5. FROM    #temp),
  6. Numeros AS
  7. (SELECT DISTINCT Nm
  8. FROM    T)
  9. SELECT  @SQL=IsNull(@SQL+','+CHAR(13),'')+'     Max(Case When Nm='+CAST(Nm AS VARCHAR)+' Then fono End) ['+CAST(Nm AS VARCHAR)+']'
  10. FROM    Numeros;
  11. SELECT  @SQL=
  12. 'With T As
  13. (Select Row_Number() Over(Partition By rut Order By fono) Nm,
  14.         *
  15. From    #temp)
  16. Select  rut,'+CHAR(13)+
  17. +@SQL+CHAR(13)+
  18. 'From   T
  19. Group By rut
  20. Order By rut;'
  21. Print   @SQL;
  22. EXEC(@SQL);
  23. SELECT  CAST(0x460065006C0069007A0020006100F1006F0020006E007500650076006F00 AS NVarchar);
cool :) buen codigo
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me

Etiquetas: cursor, horizontalmente, select, tabla, campos
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 19:31.