Estoy desarrollando una carga de datos parecido a un caso de una pregunta que se hizo hace unos días, solo que el mio varia un poco:
¿Cómo pasar datos de filas a columnas - SQL Server?
Aquí esta su código:
WITH ctePersonasArtefactos AS( SELECT p.IdPersona , p.ApellidoPaterno, p.ApellidoMaterno, p.Nombre , p.DNI , p.FechaNacimiento, d.Descripcion AS DNombreArtefacto, ROW_NUMBER() OVER( PARTITION BY p.IdPersona ORDER BY d.Descripcion) AS NumArtefacto FROM Personas p JOIN DArtefactos d ON p.IdDArtefactos = d.IdDArtefactos)SELECT IdPersona , ApellidoPaterno, ApellidoMaterno, Nombre , DNI , FechaNacimiento, MAX( CASE WHEN NumArtefacto = 1 THEN DNombreArtefacto END) AS DNombreArtefacto1, MAX( CASE WHEN NumArtefacto = 2 THEN DNombreArtefacto END) AS DNombreArtefacto2, MAX( CASE WHEN NumArtefacto = 3 THEN DNombreArtefacto END) AS DNombreArtefacto3, MAX( CASE WHEN NumArtefacto = 4 THEN DNombreArtefacto END) AS DNombreArtefacto4, MAX( CASE WHEN NumArtefacto = 5 THEN DNombreArtefacto END) AS DNombreArtefacto5, MAX( CASE WHEN NumArtefacto = 6 THEN DNombreArtefacto END) AS DNombreArtefacto6FROM ctePersonasArtefactosGROUP BY IdPersona , ApellidoPaterno, ApellidoMaterno, Nombre , DNI , FechaNacimiento;
Lo que me gustaría hacer es pasar datos de la filas a columnas, pero según viendo el caso anterior solo son máximo 6 columnas o bueno eso es lo que entiendo. Pero si tengo mas datos? Serían mas columnas aun pasando los 6...hay alguna forma de hacer columnas dinámicas osea para obtener N filas y pasarlas a N columnas? Me podrían ayudar por favor. :s
PD: Vi que un usuario lo respondió pero no de forma dinámica, y no le pude preguntar a el por el motivo de que stack overflow me pide mas puntos para preguntar en otro lados...
Mi codigo:
WITH PacientesDiagnosticos AS( SELECT top 100 p.IdPaciente , (p.ApellidoPaterno+''+p.ApellidoMaterno+''+p.PrimerNombre) as Nombres, p.NroDocumento , p.FechaNacimiento, d.Descripcion AS Dignostico, ROW_NUMBER() OVER( PARTITION BY p.IdPaciente ORDER BY d.Descripcion) AS NumArtefacto FROM Pacientes p JOIN Atenciones a ON p.IdPaciente = a.IdPaciente JOIN AtencionesDiagnosticos ad ON a.IdAtencion = ad.IdAtencion JOIN Diagnosticos d ON ad.IdDiagnostico = d.IdDiagnostico)SELECT IdPaciente , Nombres, NroDocumento , FechaNacimiento, MAX( CASE WHEN NumArtefacto = 1 THEN Dignostico END) AS Dignostico1, MAX( CASE WHEN NumArtefacto = 2 THEN Dignostico END) AS Dignostico2, MAX( CASE WHEN NumArtefacto = 3 THEN Dignostico END) AS Dignostico3, MAX( CASE WHEN NumArtefacto = 4 THEN Dignostico END) AS Dignostico4, MAX( CASE WHEN NumArtefacto = 5 THEN Dignostico END) AS Dignostico5, MAX( CASE WHEN NumArtefacto = 6 THEN Dignostico END) AS Dignostico6FROM PacientesDiagnosticosGROUP BY IdPaciente, Nombres, NroDocumento, FechaNacimiento;
Fue adaptado con el codigo anterior