Cómo convertir filas en columnas dinámicamente en SQL Server.
Aquí está la estructura de mis tablas
Resultado
id ResultId CategoryId Total Intentado Puntuación
1 8 1 30 25 20
2 8 2 30 30 19
3 8 3 30 27 21
4 7 1 20 15 10
5 7 2 20 20 15
Categoría
Id NombreCategoría
1 General
2 Aptitud
3 Técnico
Deseo obtener los datos en el siguiente formato:
Para ResultId = 8
Id General Aptitud Técnico Total
8 20 19 21 60
Para ResultId = 7
Id General Aptitud Total
7 10 15 25
Necesito ayuda para obtener los datos en el formato mencionado.
NOTA: Los datos obtenidos finalmente contienen la puntuación de la tabla Resultado, pero tienen nombres de columnas de la tabla Categoría y de acuerdo con el CategoryId en la tabla Resultado. El nombre de la columna será dinámico.
He intentado el siguiente código (solo para probar) pero no funcionó
DECLARE @SQLQuery AS NVARCHAR(MAX)
DECLARE @PivotColumns AS NVARCHAR(MAX)
SELECT @PivotColumns= COALESCE(@PivotColumns + ',','') + QUOTENAME(NombreCategoría)
FROM ( SELECT DISTINCT NombreCategoría
FROM [dbo].[Categoría] c) AS EjemploPivot
SET @SQLQuery =
N'SELECT DISTINCT ' + @PivotColumns + '
FROM [dbo].[Categoría] c
PIVOT( SUM(c.Id)
FOR NombreCategoría IN (' + @PivotColumns + ')) AS P'
EXEC sp_executesql @SQLQuery
davy.ai
Para obtener los datos en el formato requerido, se puede utilizar la siguiente consulta SQL:
Explicación:
@columns
para almacenar los nombres de columna para la tabla pivote basada en los nombres de categoría en la tablaCategory
,@sql
para construir la consulta SQL dinámica y@resultId
para establecer elResultId
deseado.Luego, utilizamos una consulta para seleccionar los nombres de columna de la tabla
Category
basados enCategoryId
yResultId
en la tablaResult
. La funciónCOALESCE
se utiliza para concatenar los nombres de columna separados por,
. El resultado se almacena en la variable@columns
.A continuación, construimos la consulta SQL dinámica utilizando
@columns
. La consulta primero utiliza una subconsulta (p
) para calcular elScore
,Attempted
yTotal
totales para cada combinación deCategoryId
yResultId
en la tablaResult
. Luego, la subconsulta se pivota utilizando la cláusulaPIVOT
para transformar las filas en columnas. Finalmente, la tabla pivote se une con la tablaResult
para obtener la columnaTotal
y filtrar las filas por elResultId
.Por último, ejecutamos la consulta SQL dinámica utilizando la función
EXEC
.Nota: La consulta está parametrizada, por lo que puedes establecer el
ResultId
deseado cambiando el valor de@resultId
. Además, esta consulta asume que la columnaCategoryName
es única en la tablaCategory
. Si eso no es así, es posible que debas modificar la variable@columns
en consecuencia.