【问题标题】:Loop through temp table and use column values as column names in a select statement in another query循环遍历临时表并在另一个查询的选择语句中使用列值作为列名
【发布时间】:2020-04-11 08:01:42
【问题描述】:

我正在创建一个临时表,并希望遍历该临时表中的行,然后在另一个查询的 select 语句中使用这些值作为列名。

临时表

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 并且可以使其与临时表中预定义的行数/值一起工作,但我将有未定义数量的审阅者,并且我无法使动态选择版本工作,因为 SQL 没有 Group_Contact 函数.

我一直坚持这一点,如果有任何建议,我将不胜感激。

【问题讨论】:

  • 假设您链接到的文章正在使用 MySQL?
  • 我使用的是microsoft sql server 2016,谢谢!
  • 一种方法是通过动态 SQL 使用 PIVOT
  • 正如 BJones 评论的那样,PIVOT... 当需求涉及转置时,我的第一直觉(“列变为行”,反之亦然)

标签: sql-server tsql sql-server-2016 dynamic-sql


【解决方案1】:

也许这个脚本会有所帮助。正如我上面提到的,它使用 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;

【讨论】:

  • 这正是我想要的。感谢您的帮助和快速解决方案。
猜你喜欢
  • 2014-12-07
  • 2022-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-01
  • 2019-07-27
  • 1970-01-01
  • 2020-04-13
相关资源
最近更新 更多