【问题标题】:covert column values into row names in sql server在sql server中将列值转换为行名
【发布时间】:2020-03-05 06:19:21
【问题描述】:

我有这个表结构

PRN               studentName       moduleName     theoryMarks 

180841220008       Mahendra          A              12             
180841220009       Mahendra1         A              13              
180841220008       Mahendra          B              12             
180841220009       Mahendra1         B              13               

我想以下面的格式显示结果

PRN               studentName      moduleName A     moduleName B 
180841220008      Mahendra         12                12
180841220009      Mahendra1        13                13

如何做到这一点?我想创建一个结果生成系统并向用户显示数据

【问题讨论】:

  • 到目前为止你尝试了什么?
  • 为什么要写for-xml-path,这个标签是什么意思?
  • @Phong 我试过动态数据透视表
  • 请向我们展示您的尝试。实际结果和您的问题是什么?
  • SELECT PRN,studentName,theoryMarks,Advanced Web Programming,Advanced Software Development Methodologies FROM (SELECT PRN, studentName, theoryMarks,moduleName FROM ModuleWiseLabTheoryMarks) orgData PIVOT ( sum(theoryMarks) FOR Color IN (Advanced Web Programming ,高级软件开发方法)) pvt 此查询在 orgdata 处显示错误

标签: sql-server pivot-table for-xml-path


【解决方案1】:

请检查一下

Declare  @yt TABLE(  [PRN] bigint, studentName  varchar(500),   moduleName       varchar(500),theoryMarks   varchar(500) );

INSERT INTO @yt (  [PRN], studentName, moduleName, theoryMarks )
VALUES     (180841220008, 'Mahendra','A', 12),
(180841220009, 'Mahendra1','A', 13),
(180841220008, 'Mahendra','B', 12),
(180841220009, 'Mahendra1','B', 13)
select [PRN], studentName, moduleName, theoryMarks   from @yt
select [PRN], studentName, [A] [moduleName A],[B] [moduleName B]from (  select [PRN], studentName, moduleName, theoryMarks   from @yt ) src
pivot
(
  max(theoryMarks)
  for 
  moduleName in ([A], [B])
) piv;

输出将是:

如果您想要对结果进行动态查询,请使用“For XML Path”进行检查

https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=ef97e15e48b531dfae538c6bcdf813eb https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=1578790046398e64f5ac7ea091d324a5

create table temp(  [PRN] bigint, studentName  varchar(500),   moduleName       varchar(500),theoryMarks   varchar(500) );

INSERT INTO temp (  [PRN], studentName, moduleName, theoryMarks )
VALUES     (180841220008, 'Mahendra','A', 12),
(180841220009, 'Mahendra1','A', 13),
(180841220008, 'Mahendra','B', 12),
(180841220009, 'Mahendra1','B', 13)

select [PRN], studentName, moduleName, theoryMarks   from temp

-----

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX);

SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.moduleName) 
            FROM temp c
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT [PRN], studentName, ' + @cols + ' from 
            (
                select [PRN], studentName, moduleName, theoryMarks
                from temp
           ) x
            pivot 
            (
                 max(theoryMarks)
                for moduleName in (' + @cols + ')
            ) p'

execute(@query)            

【讨论】:

  • 注意这个解决方案不是动态情况moduleName A, moduleName B, moduleName C, ect.
  • @Ajay2707 如何在此结果中添加序列号
  • @Ajay2707 如果我添加 ROW_NUMBER() OVER(ORDER BY PRN asc) AS SrNo,如何添加序列号以生成您的解决方案,在“查询”中会产生意外结果
  • @Ajay2707 它不允许在子查询中使用 order by 除非我在查询中使用 top
【解决方案2】:

你可以像下面这样使用pivot table dynamic

DECLARE 
    @columns NVARCHAR(MAX) = '',
    @sql     NVARCHAR(MAX) = '';


 SELECT PRN, studentName, moduleName,theoryMarks, Col = 'moduleName ' + moduleName
 into #b
 FROM #a

SELECT @columns += QUOTENAME(Col) + ','
from (SELECT DISTINCT Col FROM #b) A

-- remove the last comma
SET @columns = LEFT(@columns, LEN(@columns) - 1);


SET @sql = 'SELECT * FROM ( SELECT PRN, studentName, theoryMarks, Col FROM  #b) src PIVOT( MAX([theoryMarks]) FOR Col IN ('+ @columns +')) AS pivot_table;';

-- execute the dynamic SQL
EXECUTE sp_executesql @sql;

Result here

【讨论】:

  • @Phonge 你的回答完美解决了我的问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-30
  • 1970-01-01
  • 1970-01-01
  • 2013-05-30
  • 1970-01-01
  • 2023-03-21
  • 2013-10-01
相关资源
最近更新 更多