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

时间:2017-03-28 09:19:33

标签: sql-server sql-server-2008 for-xml-path

我有3张桌子

项目,顾问,联系方式。

Consultant表是一个仅包含3个字段的链接表,Projectid,Consultantid和Contactid,它们将联系人作为顾问链接到项目。联系人与项目没有直接联系。顾问的全名在联系表中。项目编号位于项目表中。

项目: ProjectNumber

联系人: Contactid,Consultant_Full_name

顾问:Consultantid,Projectid,Contactid

我在SSRS中构建了一个显示项目字段的表,并希望在结尾处插入一列,显示链接到每个项目的所有顾问

示例 -

+---------------+--------------------------------------+
| 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需要在聚合或group by语句中,但我无法弄清楚如何正确地执行它。我想也许我没有正确地链接表。如果我使用

 group by ts.ProjectNumber, Contactid 

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

我正在使用Sql server 2008

1 个答案:

答案 0 :(得分:1)

这就是你想要的

;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