在 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 BY
和 SELECT
中列出未聚合的列应该不会太麻烦。毕竟,您可以直接剪切和粘贴它们。
我正在尝试创建复杂视图,当我有一对多关系时,我想将这些值放入单行中。
员工 (主要 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 BY
和 SELECT
中列出未聚合的列应该不会太麻烦。毕竟,您可以直接剪切和粘贴它们。