如何获取员工使用东西功能的项目详细信息?

时间:2017-01-18 04:23:54

标签: sql sql-server

这是我的查询:

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表

enter image description here

2 个答案:

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