繁体   English   中英

如何在 sql 服务器中动态地将行转换为列

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM