преобразовать значения столбцов в имена строк на сервере sql - PullRequest
1 голос
/ 05 марта 2020

У меня есть эта структура таблицы

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

как это сделать? Я хочу создать систему генерации результатов и показать данные пользователю

Ответы [ 2 ]

4 голосов
/ 05 марта 2020

Пожалуйста, отметьте это

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;

Вывод будет:

enter image description here

Если вам нужен динамический c запрос для результат, проверьте это с помощью «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)            
1 голос
/ 05 марта 2020

Вы можете использовать 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;

Результат здесь

enter image description here

...