【问题标题】:Pivot/transpond source table to new view and concat rows将源表透视/转换到新视图和连接行
【发布时间】:2020-07-08 21:09:10
【问题描述】:

我无法弄清楚从SourceTableNewViewResult 的语句。

目前源仍在 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');

【问题讨论】:

标签: sql sql-server pivot concat


【解决方案1】:

给你

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     |
+------------------+--------+---------+-----------------------------------+--------+----------+

Online demo

【讨论】:

    【解决方案2】:

    谢谢凯厄斯。我也会检查一下。

    看来我一开始搜索的不够好。我在这里找到了一个可能的解决方案:Sql PIVOT and string concatenation aggregate

    【讨论】:

      【解决方案3】:

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

      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,
      

      【讨论】:

        猜你喜欢
        • 2019-12-17
        • 2021-06-06
        • 1970-01-01
        • 2021-10-25
        • 1970-01-01
        • 1970-01-01
        • 2012-12-06
        • 1970-01-01
        • 2013-07-29
        相关资源
        最近更新 更多