使用pivotsql的动态列名
大家好,我对SQL还比较陌生,在线搜索还没有为我提供解决方案,或者它就在我面前,但超出了我的知识范围:/。希望能在这里碰碰运气,谢谢使用pivotsql的动态列名,sql,sql-server,tsql,Sql,Sql Server,Tsql,大家好,我对SQL还比较陌生,在线搜索还没有为我提供解决方案,或者它就在我面前,但超出了我的知识范围:/。希望能在这里碰碰运气,谢谢 Table: Servers Columns: ServerUrl ServerName Rows: //server0001/space0/ Telescope1 //server0001/space1/ Space //server0001/space2/ Planet
Table: Servers
Columns: ServerUrl ServerName
Rows: //server0001/space0/ Telescope1
//server0001/space1/ Space
//server0001/space2/ Planet
Table: Projects
Columns: ServerUrl Name Entity Type
Rows: //server0001/space0/ Field1 E T1
//server0001/space1/ Field2 T T1
//server0001/space2/ Field3 E T3
通过下面的存储过程,我能够以如下方式返回数据:
因此,ServerUrl被用作列名,如下所示,但我希望它改为ServerName。我知道可以将列设置为ServerName,但由于ServerUrl可能会更改,我将如何动态地进行设置
--- Returned Data Begin ---
Stored Procedure Results:
Columns: Name Entity //server0001/space0/ ...space1 ...space2
Rows: Field1 E T1 NULL NULL
Field2 T NULL T2 NULL
Field3 E NULL NULL T3
--- Returned Data End ---
***下面的存储过程用于获取上面的结果
--- STORED PROCEDURE BEGIN ---
DECLARE @Projects varchar(max)
SELECT @ProgramList = COALESCE(@Projects + '], [', '') + ServerURL FROM
Servers ORDER BY ServerURL
SET @ProgramList = CONCAT ('[', @ProgramList + ']')
DECLARE @sql nvarchar(max)
SET @sql = 'select * from ( select P.Name, P.Entity, P.Field, P.ServerUrl
FROM ProjectFields as P ) as P pivot (min(P.Field) for P.ServerUrl in (' +
@Projects + ')) as PIV ORDER BY Name'
EXEC sp_executesql @sql1
--- STORED PROCEDURE END ---
谢谢:您的存储过程看起来不完整或更改了某些内容,但我相信您正在寻找以下内容:
DECLARE @ProgramList VARCHAR(MAX);
SELECT @ProgramList = STUFF((SELECT ',' + QUOTENAME(ServerName) FROM [Servers] ORDER BY ServerURL FOR XML PATH ('')), 1, 1, '');
DECLARE @sql VARCHAR(MAX);
SELECT @sql = '
SELECT *
FROM
(
SELECT P.Name,
P.Entity,
P.Field,
S.ServerName
FROM ProjectFields AS P
JOIN [Servers] AS S
ON S.ServerURL = P.ServerURL
) AS P
PIVOT
(
MIN(Field) FOR ServerName IN (' + @ProgramList + ')
) AS PIV
ORDER BY PIV.Name;';
--PRINT @sql;
EXEC sp_executesql @sql;
将@ProgramList select更改为ServerName而不是ServerURL,并将动态语句更改为类似“select*FROM select P.Name、P.Entity、P.Field、S.ServerName FROM ProjectFields AS P JOIN Servers AS S ON S.ServerURL=P.ServerURL AS P PIVOT MINField FOR ServerName IN'+@ProgramList+'AS PIV ORDER BY PIV.Name;”非常感谢ZLK,它很有魅力,是的,你是对的,我改变了一些事情,对不起。