这是我的查询:
SELECT employeedetail.firstname
,(
SELECT STUFF((
SELECT ',' + projectname
FROM productdetail
GROUP BY projectname
HAVING count(projectname) > 1
FOR XML PATH('')
), 1, 1, '') AS abc
FROM productdetail
INNER JOIN employeedetail ON productdetail.employeeid = employeedetail.employeeid
GROUP BY productdetail.projectname
HAVING count(productdetail.projectname) > 1
) AS projects
,count(productdetail.projectname) AS number_of_projects
FROM employeedetail
INNER JOIN productdetail ON employeedetail.employeeid = productdetail.employeeid
GROUP BY employeedetail.firstname
HAVING count(productdetail.projectname) > 1
我要做的是,我想从employeedetail表中选择员工名字,他们正在处理多个项目并基于他们的projectdetail.employeeid,它在projectdetail表中用作外键并根据它们连接项目名称。雇员
例如:
Adam project1,project2,project3
jorge project1, project2
我的查询没有给出我想要的确切结果。这是我的Projectdetail表
答案 0 :(得分:2)
试试这种方式
;WITH CTE AS (
SELECT employeedetail.employeeid
FROM employeedetail
INNER JOIN productdetail ON employeedetail.employeeid = productdetail.employeeid
GROUP BY employeedetail.employeeid
HAVING count(productdetail.projectname) > 1
)
SELECT C.employeeid, STUFF((SELECT ',' +P.projectname
FROM productdetail P
WHERE P.employeeid = C.employeeid FOR XML PATH('') ),1,1,'')
FROM CTE C
在此我已将员工ID带入CTE,他们正在进行多个项目并完成XML ...
修改强>
在你的代码中,对count>1
进行了不必要的检查,还有一件事是外部选择和内部选择(用于东西)之间没有连接。由于这些选项之间没有连接,因此逗号分隔的项目列表将附加到每个员工。
我做了同样的事情,但是在WHERE
子句中,我加入了外部选择EmpID和Stuff select EMPID。
为简化起见,我使用过CTE。你可以这样做
SELECT employeedetail.employeeid
,employeedetail.firstname
,count(productdetail.projectname) Project_Count
, STUFF((
SELECT ',' + P.projectname
FROM productdetail P
WHERE P.employeeid = employeedetail.employeeid
FOR XML PATH('')
), 1, 1, '')
FROM employeedetail
INNER JOIN productdetail ON employeedetail.employeeid = productdetail.employeeid
GROUP BY employeedetail.employeeid,employeedetail.firstname
HAVING count(productdetail.projectname) > 1
答案 1 :(得分:0)
SELECT employeedetail.firstname
,(
SELECT STUFF((
SELECT ',' + pd.projectname
FROM productdetail as pd
WHERE pd.employeeid = employeedetail.employeeid
FOR XML PATH('')
), 1, 1, '')
) AS projects
,count(DISTINCT productdetail.projectname) AS number_of_projects
FROM employeedetail
INNER JOIN productdetail ON employeedetail.employeeid = productdetail.employeeid
GROUP BY employeedetail.firstname,number_of_projects
HAVING count(DISTINCT productdetail.projectname) > 1