我有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
答案 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