sql - SQL Server 中表的单个列可以分组并连接到单个单元格中吗?

标签 sql sql-server

我正在连接 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

enter image description here

<强> SQL Fiddle

关于sql - SQL Server 中表的单个列可以分组并连接到单个单元格中吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16104035/

相关文章:

sql - 只更新单个表的事务是否总是隔离的?

sql-server - Visual Studio 2015 预览版打破了 SQL Server hierarchyid

sql - 不要重复自己 : same SQL query, 而是两个不同的表

sql-server - 如何在 powershell 中将正确的日期时间对象发送到 SQL Server?

mysql - 从字符串中提取日期并将其复制到其他日期列 SQL

sql - 如何检查列表是否具有任何不同的值

c# - 为什么 nhibernate LINQ 不支持简单的外部连接(给定外部连接表上的 where 子句)?

sql - 使用字母数字和仅字母值的混合对 SQL 中的字母数字列进行排序

MySQL - 使用占位符作为不返回任何行的子查询的值

sql - orientdb中的sql批处理和事务有什么区别?