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

Temp Table

Reviewer    |  Status
---------------------------
Reviewer1   |  Under Review
Reviewer2   |  Approved
Reviewer3   |  Denied
Reviewer4   |  Under Review

Желаемый результат

Reviewer1     |  Reviewer2     |  Reviewer3     |  Reviewer4
------------------------------------------------------------
Under Review  |  Approved      |  Denied        |  Under Review

Я следовал этому примеру: Установка значений столбца как имена столбцов в результате запроса SQL и могу заставить его работать с заранее определенным количеством строк / значений во временной таблице, но у меня будет неопределенное количество рецензентов, и я не могу заставить работать версию с динамическим выбором, потому что SQL не имеет функции Group_Contact .

Я застрял на этом некоторое время и был бы признателен за любые советы.

0
lorigar 18 Дек 2019 в 20:49

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;
0
BJones 18 Дек 2019 в 18:17