SQL 将多个表中的行连接到以逗号分隔的单个文本字段中

SQL Concatenate rows from multiple tables into single text field separated by comma

我有 3 table

项目、顾问、联系人。

顾问 table 是一个 linking table,仅包含 3 个字段,Projectid、Consultantid 和 Contactid,link 作为项目的联系人顾问。从联系人到项目没有直接的link。顾问的全名在联系人table中。项目编号在项目table.

项目: 项目编号

联系方式: 联系方式,Consultant_Full_name

顾问:Consultantid、Projectid、Contactid

我在 SSRS 中构建了一个 table 来显示项目字段,并希望在末尾添加一个列来显示每个项目的所有顾问 link

示例 -

+---------------+--------------------------------------+
| ProjectNumber |             Consultants              |
+---------------+--------------------------------------+
|         12356 | Mary White, Fred Bloggs, Peter Jones |
|         12445 | Fred Bloggs, Paul White              |
+---------------+--------------------------------------+

我写的代码是:

SELECT t2.ProjectNumber
    ,consultant = STUFF((
            SELECT ',' + fullname
            FROM FilteredContact t1
            WHERE t1.contactid = t2.ConsultantID
            FOR XML PATH('')
            ), 1, 1, '')
FROM (
    SELECT proj.ccx_projectnumber AS ProjectNumber
        ,link.contactid AS ConsultantID
        ,con.fullname AS ConsultantName
    FROM FilteredContact con
    INNER JOIN Filteredccx_ccx_project_contact_consultant AS link ON con.contactid = link.contactid
    INNER JOIN Filteredccx_project proj ON link.ccx_projectid = proj.ccx_projectid
    ) t2
GROUP BY t2.ProjectNumber

我知道这没有正确分组,因为 Contactid 需要按语句聚合或分组,但我不知道如何正确地进行分组。我在想,也许我没有正确 linked tables。如果我使用

 group by ts.ProjectNumber, Contactid 

每个顾问的结果是一行,而不是我想要的每个项目。 感激地接受任何帮助。

我正在使用 Sql 服务器 2008

这就是你想要的

;WITH CTE
AS (
    SELECT proj.ccx_projectnumber AS ProjectNumber
        ,con.fullname AS ConsultantName
    FROM Filteredccx_ccx_project_contact_consultant AS link
    INNER JOIN Filteredccx_project proj ON link.ccx_projectid = proj.ccx_projectid
    INNER JOIN FilteredContact con ON link.contactid = con.contactid
    )
SELECT DISTINCT ProjectNumber
    ,STUFF((
            SELECT ',' + ConsultantName
            FROM CTE C1
            WHERE C.ProjectNumber = C1.ProjectNumber
            FOR XML PATH('')
            ), 1, 1, '')
FROM CTE C