MS SQL-将源表旋转/转发到新视图和合并行

问题描述 投票:0回答:1

我仍然是SQL的新手,无法弄清楚从“ SourceTable”到NewViewResult的语句。

当前源仍在Microsoft SQL Server 2012上。

非常感谢您指出正确的方向。

干杯,克里斯

下面的代码创建并填充SourceTable

CREATE TABLE SourceTable![Description of Source and expected result](https://ibb.co/cxWxftk) (
    [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

sql pivot concat
1个回答
0
投票

我将通过条件聚合来做到这一点:

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,
© www.soinside.com 2019 - 2024. All rights reserved.