我仍然是SQL领域的新手,无法弄清楚从SourceTable
到NewViewResult
的语句。
当前源仍在Microsoft SQL Server 2012上。
非常感谢您指出正确的方向。
干杯,克里斯
Description of Source and expected result
下面的代码创建并填充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');
我将通过条件聚合来做到这一点:
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组concat升级的SQLS上,可以将MAX替换为GROUP_CONCAT
[如果您坚持使用原始的SQLS2012,则可能会在协调子查询上以STUFF / FOR XML PATH hack结束
MAX(STUFF((SELECT DISTINCT ',' + Name
FROM t t1 WHERE t.contract = t1.contract
FOR XML PATH('')), 1, 1, '' )) as reviewers,