在 sql 服务器中将列值转换为行名称

covert column values into row names in sql server

我有这个table结构

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

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

您可以像下面这样使用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

请检查这个

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)