Sql server 在sql server中将列值转换为行名称

Sql server 在sql server中将列值转换为行名称,sql-server,pivot-table,for-xml-path,Sql Server,Pivot Table,For Xml Path,我有这个桌子结构 PRN studentName moduleName theoryMarks 180841220008 Mahendra A 12 180841220009 Mahendra1 A 13 180841220008 Mahendra B

我有这个桌子结构

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
如何做到这一点?我想创建一个结果生成系统并向用户显示数据

您可以使用透视表动态,如下所示

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;
您可以使用透视表动态,如下所示

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;
请检查这个

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”进行检查

请检查这个

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”进行检查



到目前为止,您尝试了什么?为什么要为xml路径编写,这个标记的效果如何?@Phong我尝试了动态透视表,请告诉我们您的尝试。实际结果和您的问题是什么?选择PRN、studentName、theoryMarks、Advanced Web Programming、Advanced Software Development Methodology(高级Web编程中的颜色选择PRN、studentName、theoryMarks、moduleName)中的PRN、studentName、theoryMarks、moduleName或Data PIVOT sumtheoryMarks,高级软件开发方法学pvt此查询显示orgdataWhat出现错误到目前为止您尝试了什么?为什么要为xml路径编写,此标记如何?@Phong我尝试了动态透视表请告诉我们您的尝试。实际结果和您的问题是什么?选择PRN、studentName、theoryMarks、Advanced Web Programming、Advanced Software Development Methodology(高级Web编程中的颜色选择PRN、studentName、theoryMarks、moduleName)中的PRN、studentName、theoryMarks、moduleName或Data PIVOT sumtheoryMarks,高级软件开发方法学pvt此查询显示orgdataNote中的错误此解决方案不是动态情况moduleName a、moduleName B、moduleName C等。@Ajay2707如何在其中添加序列号result@Ajay2707如果我将PRN asc超额订购的行号添加为SrNo,如何添加序列号以生成您的解决方案,在“查询”中,它会生成意外的result@Ajay2707它不允许在子查询中使用order by,除非我在查询中使用top注意,此解决方案不是动态情况moduleName a、moduleName B、moduleName C,ect.@Ajay2707如何在该文件中添加序列号result@Ajay2707如果我将PRN asc超额订购的行号添加为SrNo,如何添加序列号以生成您的解决方案,在“查询”中,它会生成意外的result@Ajay2707它不允许在子查询中使用ORDERBY,除非我在子查询中使用top inquery@Phonge你的回答对我来说是完美的解决方案problem@Phonge你的回答是我问题的完美解决方案