遍历 temp table 并在另一个查询的 select 语句中使用列值作为列名
Loop through temp table and use column values as column names in a select statement in another query
我正在创建一个临时文件 table 并希望遍历该临时文件 table 中的行,然后在另一个查询的 select 语句中使用这些值作为列名。
温度 Table
Reviewer | Status
---------------------------
Reviewer1 | Under Review
Reviewer2 | Approved
Reviewer3 | Denied
Reviewer4 | Under Review
想要的结果
Reviewer1 | Reviewer2 | Reviewer3 | Reviewer4
------------------------------------------------------------
Under Review | Approved | Denied | Under Review
我遵循了这个例子:Setting column values as column names in the SQL query result
并且可以让它在临时 table 中与预定义数量的 rows/values 一起工作,但我将有一个未定义数量的审阅者,我无法获得动态 select 版本工作,因为 SQL 没有 Group_Contact 功能。
我已经坚持了一段时间,非常感谢任何建议。
也许这个脚本会有所帮助。正如我上面提到的,它使用 PIVOT
和动态 SQL.
CREATE TABLE Review (Reviewer VARCHAR(100), Status VARCHAR(100))
INSERT INTO Review
VALUES ('Reviewer1','Under Review'),
('Reviewer2','Approved'),
('Reviewer3','Denied'),
('Reviewer4','Under Review'),
('Reviewer5','Denied'),
('Reviewer6','Under Review');
DECLARE @columns NVARCHAR(MAX), @sql NVARCHAR(MAX);
SET @columns = N'';
SELECT @columns += N', p.' + QUOTENAME(Name)
FROM (SELECT p.Reviewer AS Name
FROM Review AS p
GROUP BY p.Reviewer) AS x;
SET @sql = N'
SELECT ' + STUFF(@columns, 1, 2, '') + '
FROM
(
SELECT p.Reviewer AS Name, p.Status
FROM Review AS p
) AS j
PIVOT
(
MAX(Status) FOR Name IN ('
+ STUFF(REPLACE(@columns, ', p.[', ',['), 1, 1, '')
+ ')
) AS p;';
PRINT @sql;
EXEC sp_executesql @sql;
我正在创建一个临时文件 table 并希望遍历该临时文件 table 中的行,然后在另一个查询的 select 语句中使用这些值作为列名。
温度 Table
Reviewer | Status
---------------------------
Reviewer1 | Under Review
Reviewer2 | Approved
Reviewer3 | Denied
Reviewer4 | Under Review
想要的结果
Reviewer1 | Reviewer2 | Reviewer3 | Reviewer4
------------------------------------------------------------
Under Review | Approved | Denied | Under Review
我遵循了这个例子:Setting column values as column names in the SQL query result 并且可以让它在临时 table 中与预定义数量的 rows/values 一起工作,但我将有一个未定义数量的审阅者,我无法获得动态 select 版本工作,因为 SQL 没有 Group_Contact 功能。
我已经坚持了一段时间,非常感谢任何建议。
也许这个脚本会有所帮助。正如我上面提到的,它使用 PIVOT
和动态 SQL.
CREATE TABLE Review (Reviewer VARCHAR(100), Status VARCHAR(100))
INSERT INTO Review
VALUES ('Reviewer1','Under Review'),
('Reviewer2','Approved'),
('Reviewer3','Denied'),
('Reviewer4','Under Review'),
('Reviewer5','Denied'),
('Reviewer6','Under Review');
DECLARE @columns NVARCHAR(MAX), @sql NVARCHAR(MAX);
SET @columns = N'';
SELECT @columns += N', p.' + QUOTENAME(Name)
FROM (SELECT p.Reviewer AS Name
FROM Review AS p
GROUP BY p.Reviewer) AS x;
SET @sql = N'
SELECT ' + STUFF(@columns, 1, 2, '') + '
FROM
(
SELECT p.Reviewer AS Name, p.Status
FROM Review AS p
) AS j
PIVOT
(
MAX(Status) FOR Name IN ('
+ STUFF(REPLACE(@columns, ', p.[', ',['), 1, 1, '')
+ ')
) AS p;';
PRINT @sql;
EXEC sp_executesql @sql;