我正在连接 SQL Server 中的多个表,并且需要返回某个设施的所有可能的经理的电子邮件地址。可能的经理由设施所在的国家/地区确定。
理想情况下,我只想为每个设施返回一行,并将所有经理的电子邮件地址放在一个单元格中,并用分号分隔。
我尝试过 Pivot 和 COALESCE 但无法产生所需的结果,有人知道如何做到这一点吗? 还是我以完全错误的方式处理这件事?
表格
CREATE TABLE Facility(
[FacilityId] [int] NOT NULL,
[Address] [varchar](256)
[CountryCode] [char](2) NOT NULL,
)
CREATE TABLE ManagementDivision(
[ManagementDivisionId] [int] NOT NULL,
[Name] [varchar](256)
[CountryCode] [char](2) NOT NULL,
)
CREATE TABLE Manager(
[ManagerID] [numeric](8, 0) NULL,
[ManagementDivisionId] [int] NOT NULL
)
CREATE TABLE Employee(
[EmployeeId] [numeric](8, 0) NOT NULL,
[mail] [varchar](1000) NULL
)
示例数据
insert into Facility (FacilityId, Address, CountryCode) values(1, '123 Fake St' 'US')
insert into Facility (FacilityId, Address, CountryCode) values(2, '789 Forgery Rd' 'US')
insert into Facility (FacilityId, Address, CountryCode) values(3, '567 Bogus Bld' 'AU')
insert into ManagementDivision (ManagementDivisionId, Name, CountryCode) values(1, 'East Coast USA' 'US')
insert into ManagementDivision (ManagementDivisionId, Name, CountryCode) values(2, 'West Coast USA' 'US')
insert into ManagementDivision (ManagementDivisionId, Name, CountryCode) values(3, 'Central USA' 'US')
insert into ManagementDivision (ManagementDivisionId, Name, CountryCode) values(4, 'Australia' 'AU')
insert into Manager (ManagerId, ManagementDivisionId) values(1, 1)
insert into Manager (ManagerId, ManagementDivisionId) values(1, 2)
insert into Manager (ManagerId, ManagementDivisionId) values(2, 3)
insert into Manager (ManagerId, ManagementDivisionId) values(3, 4)
insert into Employee (EmployeeId, mail) values(1, '<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="4429252a252321367504372b2921202b29252d2a6a272b29" rel="noreferrer noopener nofollow">[email protected]</a>')
insert into Employee (EmployeeId, mail) values(2, '<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="fd909c939c9a988fcfbd8e9290989992909c9493d39e9290" rel="noreferrer noopener nofollow">[email protected]</a>')
insert into Employee (EmployeeId, mail) values(3, '<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="ef828e818e888a9ddcaf9c80828a8b80828e8681c18c8082" rel="noreferrer noopener nofollow">[email protected]</a>')
期望的结果
FacilityId Address CountryCode ManagerEmail
1 123 Fake St US <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="264b474847414354176655494b4342494b474f480845494b" rel="noreferrer noopener nofollow">[email protected]</a>; <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="a4c9c5cac5c3c1d696e4d7cbc9c1c0cbc9c5cdca8ac7cbc9" rel="noreferrer noopener nofollow">[email protected]</a>;
2 789 Forgery Rd US <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="3558545b545250470475465a5850515a58545c5b1b565a58" rel="noreferrer noopener nofollow">[email protected]</a>; <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="a6cbc7c8c7c1c3d494e6d5c9cbc3c2c9cbc7cfc888c5c9cb" rel="noreferrer noopener nofollow">[email protected]</a>;
3 567 Bogus Bld AU <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="036e626d626466713043706c6e66676c6e626a6d2d606c6e" rel="noreferrer noopener nofollow">[email protected]</a>;
最佳答案
您可以使用Stuff
select
F.FacilityId,
F.[Address],
F.CountryCode,
STUFF(
(SELECT Distinct ', '+E.mail
from Facility F1
inner join ManagementDivision MD on F1.CountryCode=MD.CountryCode
inner join Manager M on MD.ManagementDivisionId=M.ManagementDivisionId
INNER JOIN Employee E ON M.ManagerID=E.EmployeeId
WHERE F1.Address=F.Address
AND F1.CountryCode=F.CountryCode
AND F1.FacilityId=F.FacilityId
FOR XML PATH (''))
,1,2,'') AS Email
from Facility F
<强> SQL Fiddle
关于sql - SQL Server 中表的单个列可以分组并连接到单个单元格中吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16104035/