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

Transformar N filas a N columnas

Estas en el tema de Transformar N filas a N columnas en el foro de SQL Server en Foros del Web. Buen día, resulta que me han dejado un query que al principio parecía simple, el problema es que debo convertir N número de filas a ...
  #1 (permalink)  
Antiguo 25/01/2012, 15:46
Avatar de AWesker  
Fecha de Ingreso: octubre-2008
Mensajes: 177
Antigüedad: 16 años
Puntos: 27
Transformar N filas a N columnas

Buen día, resulta que me han dejado un query que al principio parecía simple, el problema es que debo convertir N número de filas a N columnas; inicialmente creí que un PIVOT TABLE me resolvería el problema, pero creo que no he planteado bien las consultas. Para hacerlo más claro, tengo esta consulta:



La sintaxis de la consulta es:
Código SQL:
Ver original
  1. SELECT Periodo, SUM(Resultado) AS 'Suma' FROM dbo.MiTabla GROUP BY Periodo

Como ven son resultados agrupados.

Y quiero conseguir el siguiente resultado


Ojalá puedan ayudarme. Saludos...
  #2 (permalink)  
Antiguo 25/01/2012, 17:00
Avatar de AWesker  
Fecha de Ingreso: octubre-2008
Mensajes: 177
Antigüedad: 16 años
Puntos: 27
Respuesta: Transformar N filas a N columnas

Buscando el Internet y con la ayuda de uno de mis compañeros de trabajo, hemos podido convertir las N filas en N columnas (no como lo imaginé al principio, pero muy parecido). Comparto el código por si les interesa:

Código SQL:
Ver original
  1. DECLARE @Lista VARCHAR(MAX)
  2. DECLARE @Periodo AS DATETIME
  3.  
  4. SET @Periodo =(SELECT MIN(Periodo) FROM vwConsolidados WHERE Codigo = 'ABCDE001')
  5. SET @Lista = N''
  6.  
  7. WHILE @Periodo IS NOT NULL
  8. BEGIN
  9.   SET @Lista = @Lista + N',['+ CONVERT(VARCHAR, @Periodo, 103) + N']'
  10.   SET @Periodo =(SELECT MIN(Periodo) FROM vwConsolidados WHERE  Periodo > @Periodo AND Codigo = 'ABCDE001')
  11. END
  12. print @Lista
  13. SET @Lista = SUBSTRING(@Lista, 2, LEN(@Lista))
  14. --PRINT 'ok'
  15. --PRINT @Lista
  16.  
  17. DECLARE @Consulta AS nvarchar(MAX)
  18. SET @Consulta = N'SELECT *  
  19.            FROM (SELECT Periodo, Monto FROM vwConsolidados Where Codigo = ''ABCDE001''
  20.            )PIV
  21.            PIVOT (SUM(Monto) FOR  Periodo IN ('+ @Lista  + ')) AS Periodos'
  22.  
  23. EXEC sp_executesql @Consulta

Donde:
vwConsolidadoMediciones = nombre de una vista agrupada por Codigo y Periodo.
Monto = Sumatoria en la vista de un campo con el mismo nombre (Monto).

Y esta es una imágen de los resultados (vale destacar que los resultados de la suma son iguales porque en casi todos los casos son constantes):


Lo único que me falta es agregar el prefijo "Suma_" a los encabezados

¿Alguna sugerencia?
  #3 (permalink)  
Antiguo 26/01/2012, 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: Transformar N filas a N columnas

amig@ porque no buscas informacion sobre la funcion pivot??? que hace exactamente lo que necesitas
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #4 (permalink)  
Antiguo 26/01/2012, 10:58
Avatar de AWesker  
Fecha de Ingreso: octubre-2008
Mensajes: 177
Antigüedad: 16 años
Puntos: 27
Respuesta: Transformar N filas a N columnas

Gracias amig@ Libras y efectivamente, antes de postear el tema busqué información sobre el PIVOT. Y si revisas el segundo mensaje, utilice un pivot dinámico, se te agradece el comentario. Saludos...
  #5 (permalink)  
Antiguo 27/01/2012, 07:48
 
Fecha de Ingreso: enero-2012
Mensajes: 9
Antigüedad: 12 años, 9 meses
Puntos: 0
Respuesta: Transformar N filas a N columnas

El pivot no es dinamico, para eso hay que usar cursores, o concatenacion... y si te recomiendo al igual que ellos que veas PIVOT y UNPIVOT (hace al reves lo horizontal te lo pone vertical)

Saludos!

Etiquetas: columnas, filas, select, tabla, transformar
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 08:57.