如何连接此 query/relation(SQL 服务器)中的所有事件 (1..N)?

How can I concatenate all the occurrences (1..N) in this query/relation (SQL Server)?

我有这个查询:

SELECT R.Unit, LU.ReportName, R.Generated, E.EmailAddr, R.BeginDate, R.EndDate
FROM ReportsGenHistory R
JOIN ReportsLU LU ON R.ReportID = LU.ReportID
JOIN ReportsUnitEmails E ON R.Unit = E.Unit AND R.ReportID = E.ReportID;

...对于这些表:

CREATE TABLE ReportsGenHistory
(
    ID int IDENTITY(1,1) PRIMARY KEY,
    Unit VarChar(25)  NOT NULL,
    ReportID int NOT NULL,
    BeginDate DateTime NOT NULL,
    EndDate DateTime NOT NULL,
    Generated DateTime NOT NULL,
    GeneratedBy varchar(50),
);

// Lookup table
CREATE TABLE ReportsLU
(
    ReportID INT NOT NULL PRIMARY KEY,
    ReportID int NOT NULL
);

// 1..N table (a report can be emailed to N people)
CREATE TABLE ReportsUnitEmails
(
    Unit VarChar(25)  NOT NULL,
    ReportID int NOT NULL,
    EmailAddr VarChar(64)  NOT NULL,
    Created DateTime,
    CreatedBy varchar(50),
    CONSTRAINT pk_ReportsUnitEmailsCombinedKey PRIMARY KEY (Unit, ReportID, EmailAddr)
);

问题是,如所写,查询将(我认为)只是 return 来自 ReportsUnitEmails 的一个匹配的 EmailAddr,即使可能有更多。我想做的是将所有匹配的 EmailAddr 值连接到一个计算字段中,以便查询的结果集可能包含如下记录:

R.Unit      LU.ReportName       R.Generated
------      -------------       -----------
Big Red     Price Compliance    2/28/2016
Big Blue    Produce Usage       2/29/2016
Green       Delivery Perf.      3/2/2016

E.EmailAddr                                         R.BeginDate R.EndDate
-----------                                         ----------- ---------
bclayshannon@gmail.com                              1/14/2016   1/21/2016
cshannon@fbi.gov;joesmith@att.net;nobody@home.com   1/1/2015    1/31/2016
axx3andspace@att.net;bo@pres.org                    1/1/2015    1/1/2016

我该如何调整我的 SQL 以便将电子邮件地址折叠、旋转和分割成一个逗号分隔的字段?

一种方法是使用 FOR XML PATH 将电子邮件地址连接成一个字符串:

SELECT 
      R.Unit, 
      LU.ReportName, 
      R.Generated, 
      STUFF((SELECT ','+EmailAddr FROM ReportsUnitEmails E WHERE R.Unit = E.Unit AND R.ReportID = E.ReportID FOR XML PATH('')),1,1,'') AS EmailAddr, 
      R.BeginDate, 
      R.EndDate
FROM ReportsGenHistory R
JOIN ReportsLU LU ON R.ReportID = LU.ReportID;