在 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;
请检查这个
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)
我有这个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;
请检查这个
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)