【问题标题】:how to convert Row to column dynamically in sql server如何在sql server中动态将行转换为列
【发布时间】:2022-01-17 17:00:00
【问题描述】:

这是我的表格结构

结果

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

我想要以下格式的数据 对于 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

【问题讨论】:

  • 你写的代码在哪里?
  • 我尝试使用 Pivot 但没有用。我已经更新了问题
  • 你使用什么数据库?甲骨文? SQLServer ?...
  • 我使用的是 SQL Server 2014
  • 在您的代码中,您向我们展示了一个表格:DriveCategories。但是在您的问题中,您没有向我们显示该表中的列,仅显示 Category 和 Result ?

标签: sql pivot row sql-server-2014


【解决方案1】:

我的查询将为您提供预期的输出。你可以在SQL Fiddle查看输出

 --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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-24
    • 1970-01-01
    • 2015-12-04
    • 1970-01-01
    相关资源
    最近更新 更多