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

[SOLUCIONADO] Pivot de dos columnas dinamico

Estas en el tema de Pivot de dos columnas dinamico en el foro de SQL Server en Foros del Web. Amigos buenos días, como se podría hacer un pivot dinámico de dos columnas, es decir mostrar por producto y periodo las columna requerido y demanda, ...
  #1 (permalink)  
Antiguo 15/08/2014, 09:06
 
Fecha de Ingreso: agosto-2014
Mensajes: 17
Antigüedad: 10 años, 3 meses
Puntos: 0
Pivot de dos columnas dinamico

Amigos buenos días, como se podría hacer un pivot dinámico de dos columnas, es decir mostrar por producto y periodo las columna requerido y demanda, algo así:

producto [201406] [201407] [201408] ..n[periodo]
1001 4480 0 10973 1105 8960 8960
1002 8521 0 12786 4304 8960 8960

Código SQL:
Ver original
  1. CREATE TABLE #mitabla(
  2. Producto VARCHAR(04),
  3. periodo INT,
  4. Requerido NUMERIC(16,8),
  5. Demanda NUMERIC(16,8)
  6. )
  7. GO
  8.  
  9. INSERT INTO #mitabla(Producto, Periodo, Requerido, Demanda) VALUES('1001',201406,4480,0)
  10. INSERT INTO #mitabla(Producto, Periodo, Requerido, Demanda) VALUES('1001',201407,10973,1105)
  11. INSERT INTO #mitabla(Producto, Periodo, Requerido, Demanda) VALUES('1001',201408,8960,8960)
  12. INSERT INTO #mitabla(Producto, Periodo, Requerido, Demanda) VALUES('1001',201409,11200,11200)
  13. INSERT INTO #mitabla(Producto, Periodo, Requerido, Demanda) VALUES('1001',201410,30914,30914)
  14. INSERT INTO #mitabla(Producto, Periodo, Requerido, Demanda) VALUES('1001',201411,27602,27602)
  15. INSERT INTO #mitabla(Producto, Periodo, Requerido, Demanda) VALUES('1001',201412,19594,19594)
  16. INSERT INTO #mitabla(Producto, Periodo, Requerido, Demanda) VALUES('1001',201501,10719,10719)
  17. INSERT INTO #mitabla(Producto, Periodo, Requerido, Demanda) VALUES('1001',201502,7290,7290)
  18. INSERT INTO #mitabla(Producto, Periodo, Requerido, Demanda) VALUES('1002',201406,8521,0)
  19. INSERT INTO #mitabla(Producto, Periodo, Requerido, Demanda) VALUES('1002',201407,12786,4304)
  20. INSERT INTO #mitabla(Producto, Periodo, Requerido, Demanda) VALUES('1002',201408,8960,8960)
  21. INSERT INTO #mitabla(Producto, Periodo, Requerido, Demanda) VALUES('1002',201409,26880,26880)
  22. INSERT INTO #mitabla(Producto, Periodo, Requerido, Demanda) VALUES('1002',201410,37970,37970)
  23. INSERT INTO #mitabla(Producto, Periodo, Requerido, Demanda) VALUES('1002',201411,14754,14754)
  24. INSERT INTO #mitabla(Producto, Periodo, Requerido, Demanda) VALUES('1002',201412,11364,11364)
  25. INSERT INTO #mitabla(Producto, Periodo, Requerido, Demanda) VALUES('1002',201501,17947,17947)
  26. INSERT INTO #mitabla(Producto, Periodo, Requerido, Demanda) VALUES('1002',201502,3000,3000)

Última edición por gnzsoloyo; 15/08/2014 a las 09:27
  #2 (permalink)  
Antiguo 15/08/2014, 09:11
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: Pivot de dos columnas dinamico

ya hay un ejemplo en el foro:

http://www.forosdelweb.com/f87/filas...008-a-1106147/

nada mas es que lo acomodes a tus necesidades :)
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #3 (permalink)  
Antiguo 15/08/2014, 09:21
 
Fecha de Ingreso: agosto-2014
Mensajes: 17
Antigüedad: 10 años, 3 meses
Puntos: 0
Respuesta: Pivot de dos columnas dinamico

Si lo he revisado pero el resultado que necesito es algo distinto debo mostrar dos columnas por cada n periodo pivot.
  #4 (permalink)  
Antiguo 15/08/2014, 10:32
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: Pivot de dos columnas dinamico

como 2 columnas no te entiendo
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #5 (permalink)  
Antiguo 15/08/2014, 10:38
 
Fecha de Ingreso: agosto-2014
Mensajes: 17
Antigüedad: 10 años, 3 meses
Puntos: 0
Respuesta: Pivot de dos columnas dinamico

Si te fijas tengo dos datos por periodo
ejemplo: para el producto 1001 periodo [201406] tengo 4480 en requerido 0 en demanda
para el producto 1001 periodo [201407] tengo 10973 en requerido 1105 en demanda
para el producto 1001 periodo [201408] tengo 8960 en requerido 8960 en demanda

A esas dos datos por periodo me refería (requerido, demanda)

Última edición por ceqn_20; 15/08/2014 a las 11:14
  #6 (permalink)  
Antiguo 15/08/2014, 15:51
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: Pivot de dos columnas dinamico

eso lo puedes sacar con lo que te pase, solo piensale un poquito.....

Código SQL:
Ver original
  1. SELECT t1.producto,MAX(t1.[201406]),MAX(t1.[201407]),MAX(t1.[201408]),MAX(t1.[201409]),MAX(t1.[201410]),MAX(t1.[201411]),MAX(t1.[201412]),MAX(t1.[201501]),MAX(t1.[201502]),
  2. MAX(t2.[201406]),MAX(t2.[201407]),MAX(t2.[201408]),MAX(t2.[201409]),MAX(t2.[201410]),MAX(t2.[201411]),MAX(t2.[201412]),MAX(t2.[201501]),MAX(t2.[201502])
  3.  
  4. FROM(
  5. SELECT producto, [201406],[201407],[201408],[201409],[201410],[201411],[201412],[201501],[201502] FROM
  6. (
  7. SELECT producto,requerido,periodo,demanda FROM #mitabla
  8. ) AS sourcetable
  9. pivot
  10. (
  11. MAX(requerido) FOR periodo IN ( [201406],[201407],[201408],[201409],[201410],[201411],[201412],[201501],[201502])
  12. ) AS pivote
  13. ) AS t1
  14. INNER JOIN
  15. (
  16. SELECT producto, [201406],[201407],[201408],[201409],[201410],[201411],[201412],[201501],[201502] FROM
  17. (
  18. SELECT producto,requerido,periodo,demanda FROM #mitabla
  19. ) AS sourcetable
  20. pivot
  21. (
  22. MAX(demanda) FOR periodo IN ( [201406],[201407],[201408],[201409],[201410],[201411],[201412],[201501],[201502])
  23. ) AS pivote
  24. ) AS t2 ON (t1.producto=t2.producto)
  25. GROUP BY t1.producto

algo asi :) y lo obtienes con algo como esto:

Código SQL:
Ver original
  1. CREATE TABLE #mitabla(
  2. Producto VARCHAR(04),
  3. periodo INT,
  4. Requerido INT,
  5. Demanda INT
  6. )
  7. GO
  8.  
  9. INSERT INTO #mitabla(Producto, Periodo, Requerido, Demanda) VALUES('1001',201406,4480,0)
  10. INSERT INTO #mitabla(Producto, Periodo, Requerido, Demanda) VALUES('1001',201407,10973,1105)
  11. INSERT INTO #mitabla(Producto, Periodo, Requerido, Demanda) VALUES('1001',201408,8960,8960)
  12. INSERT INTO #mitabla(Producto, Periodo, Requerido, Demanda) VALUES('1001',201409,11200,11200)
  13. INSERT INTO #mitabla(Producto, Periodo, Requerido, Demanda) VALUES('1001',201410,30914,30914)
  14. INSERT INTO #mitabla(Producto, Periodo, Requerido, Demanda) VALUES('1001',201411,27602,27602)
  15. INSERT INTO #mitabla(Producto, Periodo, Requerido, Demanda) VALUES('1001',201412,19594,19594)
  16. INSERT INTO #mitabla(Producto, Periodo, Requerido, Demanda) VALUES('1001',201501,10719,10719)
  17. INSERT INTO #mitabla(Producto, Periodo, Requerido, Demanda) VALUES('1001',201502,7290,7290)
  18. INSERT INTO #mitabla(Producto, Periodo, Requerido, Demanda) VALUES('1002',201406,8521,0)
  19. INSERT INTO #mitabla(Producto, Periodo, Requerido, Demanda) VALUES('1002',201407,12786,4304)
  20. INSERT INTO #mitabla(Producto, Periodo, Requerido, Demanda) VALUES('1002',201408,8960,8960)
  21. INSERT INTO #mitabla(Producto, Periodo, Requerido, Demanda) VALUES('1002',201409,26880,26880)
  22. INSERT INTO #mitabla(Producto, Periodo, Requerido, Demanda) VALUES('1002',201410,37970,37970)
  23. INSERT INTO #mitabla(Producto, Periodo, Requerido, Demanda) VALUES('1002',201411,14754,14754)
  24. INSERT INTO #mitabla(Producto, Periodo, Requerido, Demanda) VALUES('1002',201412,11364,11364)
  25. INSERT INTO #mitabla(Producto, Periodo, Requerido, Demanda) VALUES('1002',201501,17947,17947)
  26. INSERT INTO #mitabla(Producto, Periodo, Requerido, Demanda) VALUES('1002',201502,3000,3000)
  27.  
  28.  
  29. SELECT DISTINCT periodo AS dato,IDENTITY(INT,1,1) AS rn INTO #temp2 FROM #mitabla
  30.  
  31. SELECT * FROM #temp2
  32. DECLARE @x INT
  33. DECLARE @query Nvarchar(MAX)
  34. DECLARE @variable Nvarchar(MAX)
  35. DECLARE @fecha Nvarchar(MAX)
  36. SET @x=1
  37.  
  38. SET @query=''
  39. SET @variable=''
  40. SET @fecha=''
  41. while @x<=(SELECT COUNT(*) FROM #temp2)
  42. BEGIN
  43.     SET @fecha=@fecha + (SELECT '[' + CONVERT(VARCHAR(20),dato) + ']' FROM #temp2 WHERE rn=@x) + ','   
  44.     SET @x=@x+1
  45. END
  46. print @fecha
  47.  
  48. SET @fecha=SUBSTRING(@fecha,1,len(@fecha)-1)
  49.  
  50. SET @query='
  51.  
  52. select * from(
  53. select producto, ' + @fecha +
  54. ' from
  55. (
  56. SELECT producto,requerido,periodo,demanda FROM #mitabla
  57. ) as sourcetable
  58. pivot
  59. (
  60. max(requerido) for periodo in ( ' + @fecha + ')
  61. ) as pivote
  62. ) as t1
  63. inner join
  64. (
  65. select producto, ' + @fecha +
  66. ' from
  67. (
  68. SELECT producto,requerido,periodo,demanda FROM #mitabla
  69. ) as sourcetable
  70. pivot
  71. (
  72. max(demanda) for periodo in ( ' + @fecha + ')
  73. ) as pivote
  74. ) as t2 on (t1.producto0t2.producto)
  75. )
  76.  
  77. '
  78. print @query
  79. EXEC sp_executesql @query
  80. DROP TABLE #temp2
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #7 (permalink)  
Antiguo 15/08/2014, 18:37
 
Fecha de Ingreso: agosto-2014
Mensajes: 17
Antigüedad: 10 años, 3 meses
Puntos: 0
Respuesta: Pivot de dos columnas dinamico

Muchas gracias Libra!! en principio me saltaron algunos errores en el dinámico pero los corregí, lo he complementado ya que el resultado no me convencía del todo.. pero ya esta, Gracias (;


drop table #mitabla

CREATE TABLE #mitabla(
Producto VARCHAR(04),
periodo INT,
Requerido INT,
Demanda INT
)
GO

INSERT INTO #mitabla(Producto, Periodo, Requerido, Demanda) VALUES('1001',201406,4480,0)
INSERT INTO #mitabla(Producto, Periodo, Requerido, Demanda) VALUES('1001',201407,10973,1105)
INSERT INTO #mitabla(Producto, Periodo, Requerido, Demanda) VALUES('1001',201408,8960,8960)
INSERT INTO #mitabla(Producto, Periodo, Requerido, Demanda) VALUES('1001',201409,11200,11200)
INSERT INTO #mitabla(Producto, Periodo, Requerido, Demanda) VALUES('1001',201410,30914,30914)
INSERT INTO #mitabla(Producto, Periodo, Requerido, Demanda) VALUES('1001',201411,27602,27602)
INSERT INTO #mitabla(Producto, Periodo, Requerido, Demanda) VALUES('1001',201412,19594,19594)
INSERT INTO #mitabla(Producto, Periodo, Requerido, Demanda) VALUES('1001',201501,10719,10719)
INSERT INTO #mitabla(Producto, Periodo, Requerido, Demanda) VALUES('1001',201502,7290,7290)
INSERT INTO #mitabla(Producto, Periodo, Requerido, Demanda) VALUES('1002',201406,8521,0)
INSERT INTO #mitabla(Producto, Periodo, Requerido, Demanda) VALUES('1002',201407,12786,4304)
INSERT INTO #mitabla(Producto, Periodo, Requerido, Demanda) VALUES('1002',201408,8960,8960)
INSERT INTO #mitabla(Producto, Periodo, Requerido, Demanda) VALUES('1002',201409,26880,26880)
INSERT INTO #mitabla(Producto, Periodo, Requerido, Demanda) VALUES('1002',201410,37970,37970)
INSERT INTO #mitabla(Producto, Periodo, Requerido, Demanda) VALUES('1002',201411,14754,14754)
INSERT INTO #mitabla(Producto, Periodo, Requerido, Demanda) VALUES('1002',201412,11364,11364)
INSERT INTO #mitabla(Producto, Periodo, Requerido, Demanda) VALUES('1002',201501,17947,17947)
INSERT INTO #mitabla(Producto, Periodo, Requerido, Demanda) VALUES('1002',201502,3000,3000)


SELECT DISTINCT periodo AS dato,IDENTITY(INT,1,1) AS rn INTO #temp2 FROM #mitabla

--SELECT * FROM #temp2
DECLARE @x INT
DECLARE @query Nvarchar(MAX)
DECLARE @variable Nvarchar(MAX)
DECLARE @fecha Nvarchar(MAX)
DECLARE @fecha2 Nvarchar(MAX)
SET @x=1

SET @query=''
SET @variable=''
SET @fecha=''
SET @fecha2=' t1.producto, '
while @x<=(SELECT COUNT(*) FROM #temp2)
BEGIN --MAX(t1.[201406])[201406],MAX(t1.[201407])[201407],
SET @fecha=@fecha + (SELECT '[' + CONVERT(VARCHAR(20),dato) + ']' FROM #temp2 WHERE rn=@x) + ','
SET @fecha2=@fecha2 + (SELECT 'MAX(t1.[' + CONVERT(VARCHAR(20),dato) + '])[' + CONVERT(VARCHAR(20),dato) + '], MAX(t2.[' + CONVERT(VARCHAR(20),dato) + '])[' + CONVERT(VARCHAR(20),dato) + ']' FROM #temp2 WHERE rn=@x) + ','
SET @x=@x+1
END
print @fecha

SET @fecha=SUBSTRING(@fecha,1,len(@fecha)-1)
SET @fecha2=SUBSTRING(@fecha2,1,len(@fecha2)-1)

SET @query='

select ' + @fecha2 + ' from(
select producto, ' + @fecha +
' from
(
SELECT producto,requerido,periodo,demanda FROM #mitabla
) as sourcetable
pivot
(
max(requerido) for periodo in ( ' + @fecha + ')
) as pivote
) as t1
inner join
(
select producto, ' + @fecha +
' from
(
SELECT producto,requerido,periodo,demanda FROM #mitabla
) as sourcetable
pivot
(
max(demanda) for periodo in ( ' + @fecha + ')
) as pivote
) as t2 on (t1.producto=t2.producto)
GROUP BY t1.producto

'
print @query
EXEC sp_executesql @query
DROP TABLE #temp2

Última edición por ceqn_20; 15/08/2014 a las 19:03

Etiquetas: columna, columnas, dinamico, pivot, 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 14:47.