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

[SOLUCIONADO] Tablas Pivoteadas con Multiples valores.

Estas en el tema de Tablas Pivoteadas con Multiples valores. en el foro de SQL Server en Foros del Web. Buenos días; Hola amigos de foros del web, una vez mas acudo a uds para consultarles acerca de una duda que me asalta y me ...
  #1 (permalink)  
Antiguo 21/11/2013, 14:08
 
Fecha de Ingreso: mayo-2011
Mensajes: 47
Antigüedad: 13 años, 5 meses
Puntos: 1
Pregunta Tablas Pivoteadas con Multiples valores.

Buenos días;

Hola amigos de foros del web, una vez mas acudo a uds para consultarles acerca de una duda que me asalta y me mortifica, y es la siguiente:

teniendo una tabla de trabajadores con estos datos:

consecutivo | trabajador | labor1|labor2|labor3|
01 | 001 | 1|0|0
01 | 002 | 0|1|0
01 | 003 | 0|0|1
01 | 004 | 0|1|0

consecutivo | trabajador | labor1|labor2|labor3|
02 | 001 | 0|0|1
02 | 002 | 0|0|1
02 | 003 | 0|1|0
02 | 004 | 1|0|0

consecutivo | trabajador | labor1|labor2|labor3|
03 | 001 | 1|0|0
03 | 002 | 1|0|0
03 | 003 | 1|0|0
03 | 004 | 1|0|0

consecutivo | trabajador | labor1|labor2|labor3|
04 | 001 | 0|1|0
04 | 002 | 0|1|0
04 | 003 | 1|0|0
04 | 004 | 0|0|1

Y una tabla que guarda las fechas

consecutivo | fecha
01 | 2013-11-01
02 | 2013-11-02
03 | 2013-11-03
04 | 2013-11-04

La idea es que al enviar el rango de fechas 2013-11-01 al 2013-11-04

el resultado sea el siguiente, donde el valor en la fecha indica la labor que realizo ese día

trabajador | 2013-11-01 |2013-11-02 |2013-11-03 |2013-11-04
001 | 1 | 3 | 1 | 2
002 | 2 | 3 | 1 | 2
003 | 3 | 2 | 1 | 1
004 | 2 | 1 | 1 | 3

En una anterior consulta me recomendaron usar PIVOT y me funcionó pero en esta ocasión necesito saber que labor se realizo ese día sabiendo que solo se puede realizar una labor por día, osea que en un mismo día no habrán dos labores.

Ademas determinar que el rango de la fecha es variable asi que pueden ser desde 1 hasta 100.

Agradezco cualquier ayuda q me puedan brindar o documentación para instruirme, en este tema.
  #2 (permalink)  
Antiguo 21/11/2013, 14:43
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, 3 meses
Puntos: 774
Respuesta: Tablas Pivoteadas con Multiples valores.

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.  
  34. CREATE TABLE #temp2
  35. (
  36. consecutivo VARCHAR(20),
  37. fecha datetime
  38. )
  39.  
  40. INSERT INTO #temp2 VALUES ('01','2013-11-01')
  41. INSERT INTO #temp2 VALUES ('02','2013-11-02')
  42. INSERT INTO #temp2 VALUES ('03','2013-11-03')
  43. INSERT INTO #temp2 VALUES ('04','2013-11-04')
  44.  
  45.  
  46.  
  47. SELECT trabajador,SUM([2013-11-01]) AS [2013-11-01],SUM([2013-11-02]) [2013-11-02],SUM([2013-11-03]) [2013-11-03],SUM([2013-11-04]) [2013-11-04]
  48. FROM
  49. (
  50.     SELECT trabajador,[2013-11-01],[2013-11-02],[2013-11-03],[2013-11-04] FROM
  51.     (
  52.     SELECT t1.consecutivo,t1.trabajador,
  53.     CASE WHEN labor1=1 THEN 1
  54.     WHEN labor2=1 THEN 2
  55.     WHEN labor3=1 THEN 3 END AS labor,
  56.     fecha FROM #temp AS t1
  57.     LEFT JOIN #temp2 AS t2 ON (t1.consecutivo=t2.consecutivo)
  58.     WHERE fecha BETWEEN '2013-11-01' AND '2013-11-04'
  59.     ) AS SOURCE
  60.     pivot
  61.     (
  62.     MAX(labor) FOR fecha IN ([2013-11-01],[2013-11-02],[2013-11-03],[2013-11-04])
  63.     ) AS pvt
  64. ) AS t1 GROUP BY trabajador

Para la parte de las fechas, se puede lograr con un query dinamico tomando en cuenta la diferencia de dias entre la fecha inicial y la fecha final y sacando las diferentes fechas con un ciclo para poder armar la cadena como quieres :P pero eso si ya seria por tu cuenta o con costo($$$$) adicional(se aceptan pagos por paypal :P)
__________________
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 15:00
  #3 (permalink)  
Antiguo 21/11/2013, 15:38
 
Fecha de Ingreso: mayo-2011
Mensajes: 47
Antigüedad: 13 años, 5 meses
Puntos: 1
Respuesta: Tablas Pivoteadas con Multiples valores.

Me mato la parte del paypal, jajajaj bueno la idea del jquery no es aceptable ya que podria tener el mismo efecto con un for y la idea es no saturar la red sino dar toda carga al servidor, aunque tu solucion, me parece muy factible tenia la idea de hacerlo con un case, pero utilizar un max si me cogio de sorpresa, gracias por tu ayuda.
  #4 (permalink)  
Antiguo 21/11/2013, 15:53
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, 3 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

Etiquetas: fecha, multiples, tabla, tablas
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 14:01.