Ver Mensaje Individual
  #4 (permalink)  
Antiguo 21/11/2013, 15:53
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: Tablas Pivoteadas con Multiples valores.

aqui esta la solucion con un query dinamico, aclaro el query dinamico nada mas es para obtener los valores de las columnas a pivotear, no ejecutaras el query 1 vez cada dia....y como es cadena se obtiene rapido y no consume mucho el servidor, lo probe en mi server local y para obtener las fechas hasta el 30 de abril del 2014 tardo 2 segundos :P

Código SQL:
Ver original
  1. CREATE TABLE #temp
  2. (
  3. consecutivo VARCHAR(20),
  4. trabajador VARCHAR(20),
  5. labor1 INT,
  6. labor2 INT,
  7. labor3 INT
  8. )
  9.  
  10. INSERT INTO #temp VALUES ('01','001' ,1,0,0)
  11. INSERT INTO #temp VALUES ('01','002' ,0,1,0)
  12. INSERT INTO #temp VALUES ('01','003' ,0,0,1)
  13. INSERT INTO #temp VALUES ('01','004' ,0,1,0)
  14.  
  15.  
  16. INSERT INTO #temp VALUES ('02','001',0,0,1)
  17. INSERT INTO #temp VALUES ('02','002',0,0,1)
  18. INSERT INTO #temp VALUES ('02','003',0,1,0)
  19. INSERT INTO #temp VALUES ('02','004',1,0,0)
  20.  
  21.  
  22. INSERT INTO #temp VALUES ('03','001',1,0,0)
  23. INSERT INTO #temp VALUES ('03','002',1,0,0)
  24. INSERT INTO #temp VALUES ('03','003',1,0,0)
  25. INSERT INTO #temp VALUES ('03','004',1,0,0)
  26.  
  27.  
  28. INSERT INTO #temp VALUES ('04','001',0,1,0)
  29. INSERT INTO #temp VALUES ('04','002',0,1,0)
  30. INSERT INTO #temp VALUES ('04','003',1,0,0)
  31. INSERT INTO #temp VALUES ('04','004',0,0,1)
  32.  
  33. INSERT INTO #temp VALUES ('05','001',1,0,1)
  34. INSERT INTO #temp VALUES ('05','002',1,1,1)
  35. INSERT INTO #temp VALUES ('05','003',1,1,0)
  36. INSERT INTO #temp VALUES ('05','004',1,0,1)
  37.  
  38.  
  39. INSERT INTO #temp VALUES ('06','001',0,0,0)
  40. INSERT INTO #temp VALUES ('06','002',0,1,0)
  41. INSERT INTO #temp VALUES ('06','003',0,1,0)
  42. INSERT INTO #temp VALUES ('06','004',0,0,0)
  43.  
  44.  
  45. INSERT INTO #temp VALUES ('07','001',1,1,0)
  46. INSERT INTO #temp VALUES ('07','002',0,1,0)
  47. INSERT INTO #temp VALUES ('07','003',1,0,0)
  48. INSERT INTO #temp VALUES ('07','004',0,1,1)
  49.  
  50. INSERT INTO #temp VALUES ('08','001',0,0,1)
  51. INSERT INTO #temp VALUES ('08','002',0,0,1)
  52. INSERT INTO #temp VALUES ('08','003',1,0,0)
  53. INSERT INTO #temp VALUES ('08','004',1,0,0)
  54. INSERT INTO #temp VALUES ('08','005',0,0,1)
  55.  
  56.  
  57.  
  58. CREATE TABLE #temp2
  59. (
  60. consecutivo VARCHAR(20),
  61. fecha datetime
  62. )
  63.  
  64. INSERT INTO #temp2 VALUES ('01','2013-11-01')
  65. INSERT INTO #temp2 VALUES ('02','2013-11-02')
  66. INSERT INTO #temp2 VALUES ('03','2013-11-03')
  67. INSERT INTO #temp2 VALUES ('04','2013-11-04')
  68. INSERT INTO #temp2 VALUES ('05','2013-11-05')
  69. INSERT INTO #temp2 VALUES ('06','2013-11-06')
  70. INSERT INTO #temp2 VALUES ('07','2013-11-07')
  71. INSERT INTO #temp2 VALUES ('08','2013-11-08')
  72.  
  73.  
  74. DECLARE @inicial datetime
  75. DECLARE @inicial2 datetime
  76. DECLARE @final datetime
  77. DECLARE @x INT
  78. DECLARE @dias INT
  79. DECLARE @pivot VARCHAR(MAX)
  80. DECLARE @header VARCHAR(MAX)
  81.  
  82.  
  83. SET @inicial='2013-11-01'
  84. SET @inicial2=@inicial
  85. SET @final='2013-11-08'
  86. SET @dias=datediff(dd,@inicial,@final)
  87.  
  88.  
  89. SET @pivot=''
  90. SET @header=''
  91. SET @x=1
  92. while @x<=@dias
  93. BEGIN
  94. SET @pivot=@pivot + '[' + REPLACE(CONVERT(VARCHAR(20),@inicial,111),'/','-') + '],'
  95. SET @header=@header + 'sum(' + '[' + REPLACE(CONVERT(VARCHAR(20),@inicial,111),'/','-') + ']) as ' + '[' + REPLACE(CONVERT(VARCHAR(20),@inicial,111),'/','-') + '],'
  96. SET @inicial=dateadd(dd,1,@inicial)
  97.     IF @dias=@x
  98.         BEGIN
  99.             SET @pivot=@pivot + '[' + REPLACE(CONVERT(VARCHAR(20),@inicial,111),'/','-') + ']'
  100.             SET @header=@header + 'sum(' + '[' + REPLACE(CONVERT(VARCHAR(20),@inicial,111),'/','-') + ']) as ' + '[' + REPLACE(CONVERT(VARCHAR(20),@inicial,111),'/','-') + ']'
  101.         END
  102. SET @x=@x+1
  103. END
  104.  
  105.  
  106. DECLARE @query Nvarchar(MAX)
  107. SET @query='select trabajador,' + @header + '
  108. from
  109. (
  110.     SELECT trabajador,' + @pivot +' FROM
  111.     (
  112.     SELECT t1.consecutivo,t1.trabajador,
  113.     case when labor1=1 then 1
  114.     when labor2=1 then 2
  115.     when labor3=1 then 3 end as labor,
  116.     fecha FROM #temp as t1
  117.     LEFT JOIN #temp2 as t2 on (t1.consecutivo=t2.consecutivo)
  118.     WHERE fecha BETWEEN ' + CHAR(39) + REPLACE(CONVERT(VARCHAR(20),@inicial2,111),'/','-') + CHAR(39) + ' and ' + CHAR(39) +  REPLACE(CONVERT(VARCHAR(20),@final,111),'/','-') + CHAR(39) + '
  119.     ) AS source
  120.     pivot
  121.     (
  122.     max(labor) FOR fecha IN (' + @pivot +')
  123.     ) AS pvt
  124. ) as t1 group by trabajador'
  125.  
  126.  
  127. EXEC sp_executesql @query

saludos!

P.S: Lo del paypal no es broma......
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me

Última edición por Libras; 21/11/2013 a las 16:02