T-SQL 将间接相关的表组合成单个查询
T-SQL combine indirectly related tables into single query
我有一个名为“业务”的父级 table,有两个不同的 related/child table(分支机构和员工)与业务相关,但彼此没有直接联系。
我想要一个 SQL 查询,该查询将显示所有企业、分支机构和员工,每个员工都有一个行项目。例如,假设业务“B1”有 2 个关联公司(A1 和 A2)和两个员工(E1 和 E2),我想要一个查询结果类似于:
Business
Affiliates
Empl #
Empl Name
B1
A1, A2
1
John
B1
A1, A2
2
Bob
我得到的最接近的输出如下所示:
Business
Affiliates
Empl #
Empl Name
B1
A1
1
John
B1
A1
2
Bob
B1
A2
1
John
B1
A2
2
Bob
但如您所见,每个员工显示两次(每个附属公司一次)。
关于如何达到预期结果有什么建议吗?
使用 SQL 服务器 2017 及更高版本:
WITH existing as (
-- your existing query goes here
)
SELECT Business, string_agg(Affiliates, ',') as Affiliates,
[Empl #], MAX([Empl Name]) As [Empl Name]
FROM existing
GROUP BY Business, [Empl #]
你可以做到这一点。
DECLARE @Sample TABLE ( business char(12), affiliates VARCHAR(25), empid int);
INSERT INTO @Sample VALUES
( 'B1', 'A1', 50 ),
( 'B1', 'A1', 80 ),
( 'B1', 'A2', 90 ),
( 'B1', 'A2', 50 );
SELECT O.business,
STUFF( (SELECT DISTINCT ', ' + CAST(affiliates AS VARCHAR(25))
FROM @Sample I WHERE I.business = O.business FOR XML PATH('')
), 1, 2, '')
FROM @Sample O
GROUP BY O.business;
结果:
根据您的需要进行更改。
我有一个名为“业务”的父级 table,有两个不同的 related/child table(分支机构和员工)与业务相关,但彼此没有直接联系。
我想要一个 SQL 查询,该查询将显示所有企业、分支机构和员工,每个员工都有一个行项目。例如,假设业务“B1”有 2 个关联公司(A1 和 A2)和两个员工(E1 和 E2),我想要一个查询结果类似于:
Business | Affiliates | Empl # | Empl Name |
---|---|---|---|
B1 | A1, A2 | 1 | John |
B1 | A1, A2 | 2 | Bob |
我得到的最接近的输出如下所示:
Business | Affiliates | Empl # | Empl Name |
---|---|---|---|
B1 | A1 | 1 | John |
B1 | A1 | 2 | Bob |
B1 | A2 | 1 | John |
B1 | A2 | 2 | Bob |
但如您所见,每个员工显示两次(每个附属公司一次)。
关于如何达到预期结果有什么建议吗?
使用 SQL 服务器 2017 及更高版本:
WITH existing as (
-- your existing query goes here
)
SELECT Business, string_agg(Affiliates, ',') as Affiliates,
[Empl #], MAX([Empl Name]) As [Empl Name]
FROM existing
GROUP BY Business, [Empl #]
你可以做到这一点。
DECLARE @Sample TABLE ( business char(12), affiliates VARCHAR(25), empid int);
INSERT INTO @Sample VALUES
( 'B1', 'A1', 50 ),
( 'B1', 'A1', 80 ),
( 'B1', 'A2', 90 ),
( 'B1', 'A2', 50 );
SELECT O.business,
STUFF( (SELECT DISTINCT ', ' + CAST(affiliates AS VARCHAR(25))
FROM @Sample I WHERE I.business = O.business FOR XML PATH('')
), 1, 2, '')
FROM @Sample O
GROUP BY O.business;
结果:
根据您的需要进行更改。