Сводная / переносная исходная таблица для нового представления и строк - PullRequest
0 голосов
/ 28 марта 2020

Я не могу понять оператор для перехода от SourceTable к NewViewResult.

В настоящее время источник все еще находится на Microsoft SQL Server 2012.

Описание источника и ожидаемый результат

Ниже приведен код для создания и заполнения SourceTable:

CREATE TABLE SourceTable
(
    [Contract] [nvarchar] (255) NULL,
    [Role] [nvarchar] (255) NULL,
    [Name] [nvarchar] (255) NULL
);

INSERT INTO [SourceTable] ([Contract], [Role], [Name]) 
VALUES ('First Contract', 'Author', 'Tom');
INSERT INTO [SourceTable] ([Contract], [Role], [Name]) 
VALUES ('First Contract', 'Manager', 'Ben');
INSERT INTO [SourceTable] ([Contract], [Role], [Name]) 
VALUES ('First Contract', 'Reviewer', 'Kate');
INSERT INTO [SourceTable] ([Contract], [Role], [Name]) 
VALUES ('First Contract', 'Signee', 'John');
INSERT INTO [SourceTable] ([Contract], [Role], [Name]) 
VALUES ('First Contract', 'Singee 2', 'Eli');
INSERT INTO [SourceTable] ([Contract], [Role], [Name]) 
VALUES ('Another Contract', 'Author', 'Chris');
INSERT INTO [SourceTable] ([Contract], [Role], [Name]) 
VALUES ('Another Contract', 'Manager', 'Susan');
INSERT INTO [SourceTable] ([Contract], [Role], [Name]) 
VALUES ('Another Contract', 'Reviewer', 'Davis');
INSERT INTO [SourceTable] ([Contract], [Role], [Name]) 
VALUES ('Another Contract', 'Reviewer', 'Tomi');
INSERT INTO [SourceTable] ([Contract], [Role], [Name]) 
VALUES ('Another Contract', 'Reviewer', 'Jane');
INSERT INTO [SourceTable] ([Contract], [Role], [Name]) 
VALUES ('Another Contract', 'Reviewer', 'Dolly');
INSERT INTO [SourceTable] ([Contract], [Role], [Name]) 
VALUES ('Another Contract', 'Reviewer', 'Ray');
INSERT INTO [SourceTable] ([Contract], [Role], [Name]) 
VALUES ('Another Contract', 'Reviewer', 'Pat');
INSERT INTO [SourceTable] ([Contract], [Role], [Name]) 
VALUES ('Another Contract', 'Reviewer', 'Amy');
INSERT INTO [SourceTable] ([Contract], [Role], [Name]) 
VALUES ('Another Contract', 'Signee', 'Eli');
INSERT INTO [SourceTable] ([Contract], [Role], [Name]) 
VALUES ('Another Contract', 'Signee 2', 'John');

Source Table to new View

Ответы [ 3 ]

0 голосов
/ 28 марта 2020

Спасибо, Гай. Я тоже это проверю.

Кажется, я не нашел достаточно хорошего поиска. Я нашел возможное решение здесь: Sql PIVOT и агрегат конкатенации строк

0 голосов
/ 28 марта 2020

Здесь вы go

SELECT Contract, 
       STRING_AGG(CASE WHEN Role = 'Author' THEN Name END, ',') Author,
       STRING_AGG(CASE WHEN Role = 'Manager' THEN Name END, ',') Manager,
       STRING_AGG(CASE WHEN Role = 'Reviewer' THEN Name END, ',') Reviewer,
       STRING_AGG(CASE WHEN Role = 'Signee' THEN Name END, ',') Signee,
       STRING_AGG(CASE WHEN Role = 'Signee 2' THEN Name END, ',') [Singee 2]
FROM SourceTable
GROUP BY Contract
ORDER BY Contract DESC;

Возвраты:

+------------------+--------+---------+-----------------------------------+--------+----------+
|     Contract     | Author | Manager |             Reviewer              | Signee | Singee 2 |
+------------------+--------+---------+-----------------------------------+--------+----------+
| First Contract   | Tom    | Ben     | Kate                              | John   | Eli      |
| Another Contract | Chris  | Susan   | Davis,Tomi,Jane,Dolly,Ray,Pat,Amy | Eli    | John     |
+------------------+--------+---------+-----------------------------------+--------+----------+

Онлайн демо

0 голосов
/ 28 марта 2020

Я бы сделал это с помощью условной агрегации:

SELECT 
  contract,
  MAX(CASE WHEN role = 'Author' Then Name End) as Author,
  MAX(CASE WHEN role = 'Manager' Then Name End) as Manager,
  ...
FROM t
GROUP BY contract

Но небольшим препятствием является несколько имен. На более современном SQLS или одном, обновленном с помощью группы CLR, вы могли бы поменять MAX на GROUP_CONCAT

Если вы придерживаетесь своего ванильного SQLS2012, вы, вероятно, в конечном итоге получите STUFF / FOR XML PATH взломать скоординированный подзапрос

MAX(STUFF((SELECT DISTINCT ',' + Name 
FROM t t1 WHERE t.contract = t1.contract
FOR XML PATH('')), 1, 1, '' )) as reviewers,
...