Ver Mensaje Individual
  #3 (permalink)  
Antiguo 28/12/2012, 14:48
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: 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