[英]how to convert Row to column dynamically in sql server
这是我的表格结构
结果
id ResultId CategoryId Total Attempted Score
----------------------------------------------------
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
类别
Id CategoryName
-----------------------
1 General
2 Aptitude
3 Technical
我想要以下格式的数据 For ResultId = 8
Id General Aptitude Technical Total
--------------------------------------------------
8 20 19 21 60
对于 ResultId = 7
Id General Aptitude Total
-------------------------------------
7 10 15 25
我需要帮助来获取上述格式的数据。
注意:最终获取的数据包含来自 Result 表的分数,但具有来自类别表的列名并根据 Result 表中的 CategoryId。 列名将是动态的
尝试了以下代码(仅用于测试)但没有用
DECLARE @SQLQuery AS NVARCHAR(MAX)
DECLARE @PivotColumns AS NVARCHAR(MAX)
SELECT @PivotColumns= COALESCE(@PivotColumns + ',','') + QUOTENAME(CategoryName)
FROM ( SELECT DISTINCT CategoryName
FROM [dbo].[Category] c) AS PivotExample
SET @SQLQuery =
N'SELECT DISTINCT ' + @PivotColumns + '
FROM [dbo].[Category] c
PIVOT( SUM(c.Id)
FOR CategoryName IN (' + @PivotColumns + ')) AS P'
EXEC sp_executesql @SQLQuery
我的查询将为您提供预期的 output。 您可以在SQL Fiddle中查看 output
--dynamic with case
DECLARE @Sql NVARCHAR(4000) = NULL
DECLARE @ColumnHeaders NVARCHAR(4000);
SET @ColumnHeaders = STUFF((
SELECT DISTINCT ',' + 'Max(CASE WHEN rn =' + quotename(rn, '''') + ' THEN Score else null end ) as ' + CategoryName + CHAR(10) + CHAR(13)
FROM (
SELECT CategoryName, row_number() OVER (ORDER BY CategoryName) rn
FROM ( SELECT DISTINCT CategoryName FROM Category) t0
) t1
FOR XML PATH('')
,TYPE
).value('.', 'varchar(max)'), 1, 1, '');
--print @ColumnHeaders
SET @sql = N' ;with cte as (
select * , Row_number() Over(Partition by ResultId Order by ResultId ) rn from
Result)
Select ResultId, ' + @ColumnHeaders + ', SUM(Score) Total from cte Group by
ResultId ';
EXECUTE sp_executesql @sql
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.