在 SQL 视图中将多行合并为单行(不使用分组依据或使用 CTE?)

Combine multiple rows into single row in SQL View (without group by or with CTE?)

我正在尝试创建复杂视图,当我有一对多关系时,我想将这些值放入单行中。

员工 (主要 table)

ID            Name
1             aaa
2             bbb

其他员工(table一对多)

ID            StaffId       Name       Value
1             1             xxx        888
2             1             yyy        777
3             2             vvv        333

一些Table (table一对一)

 Id          StaffId        SomeVal
 1           1              qwert
 2           2              asd

结果:

ID            Name          OtherStaff                SomeVal
1             aaa           xxx, 888; yyy, 777        qwert
2             bbb           vvv, 333                  asd

查看:

CREATE VIEW MyView
AS 
SELECT DISTINCT
    Staff.Id,
    MagicCombine(OtherStaff.Name, OtherStaff.Value) -- pseudocode
    SomeTable.SomeVal   
FROM 
    dbo.[Staff] Staff 
    JOIN dbo.[OtherStaff] OtherStaff ON OtherStaff.StaffId = Staff.Id
    JOIN dbo.[SomeTable] SomeTable ON SomeTable.StaffId= Staff.Id

我读到我可以使用 GroupBy,但实际上我会有很多 JOINS 和 Columns,但是 GroupBy 要求将它们全部放入子句。我在考虑更优雅的解决方案? CTE – 常见 Table 表达式是否有用?

您的“神奇功能”似乎是 STRING_AGG()

代码将如下所示:

CREATE VIEW MyView AS 
    SELECT Staff.Id,
           STRING_AGG(CONCAT(OtherStaff.Name, ', ', OtherStaff.Value), '; ')  WITHIN GROUP (ORDER BY OtherStaff.Name),
           SomeTable.SomeVal   
    FROM dbo.[Staff] Staff JOIN
         dbo.[OtherStaff] OtherStaff
         ON OtherStaff.StaffId = Staff.Id JOIN
         dbo.[SomeTable] SomeTable
         ON SomeTable.StaffId = Staff.Id
    GROUP BY Staff.Id, SomeTable.SomeVal;

GROUP BYSELECT 中列出未聚合的列应该不会太麻烦。毕竟,您可以直接剪切和粘贴它们。