Sql 如何使用stuff函数获取员工的项目详细信息?
我的问题是:Sql 如何使用stuff函数获取员工的项目详细信息?,sql,sql-server,Sql,Sql Server,我的问题是: SELECT employeedetail.firstname ,( SELECT STUFF(( SELECT ',' + projectname FROM productdetail GROUP BY projectname HAVING count(projectname) > 1
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表的外键,并根据employeename连接他们的项目名
例如:
Adam project1,project2,project3
jorge project1, project2
我的查询没有给出我想要的确切结果。这是我的项目明细表
这样试试
;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,他们有多个项目,并完成了for XML
编辑:
在您的代码中,对count>1进行了不必要的检查,还有一件事是,用于填充的外部选择和内部选择之间没有连接。由于这些选择之间没有连接,因此逗号分隔的项目列表将附加到每个员工
我也做了同样的事情,但在WHERE子句中,我将外部Select EmpID与东西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
这样试试
;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,他们有多个项目,并完成了for XML
编辑:
在您的代码中,对count>1进行了不必要的检查,还有一件事是,用于填充的外部选择和内部选择之间没有连接。由于这些选择之间没有连接,因此逗号分隔的项目列表将附加到每个员工
我也做了同样的事情,但在WHERE子句中,我将外部Select EmpID与东西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
你能试试这个吗
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
你能试试这个吗
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
它正在工作,但我的代码有什么问题?我不想用CTEgIven解释你在代码中的错误。检查更新的答案@JasonClarkit正在工作,但如果我也想检索firstname呢?其次,我正在运行以下代码:选择STUFF SELECT',projectname FROM productdetail,其中productdetail.employeeid=employeedetail.employeeid作为XML路径1,1,作为productdetail内部的abc在productdetail.employeeid=employeedetail.employeeid组中加入employeedetail.firstname,employeedetail.employeeid具有countproductdetail.projectname>1,它在子查询中分别为我提供项目详细信息,而对于firstname,我使用的是主查询,但在组合这两个查询时提供错误如果要显示firstname、计数值,可以。。但是把名字放在小组里。它可以工作,但是我的代码有什么问题吗?我不想用CTEgIven解释你在代码中的错误。检查更新的答案@JasonClarkit正在工作,但如果我也想检索firstname呢?其次,我正在运行以下代码:选择STUFF SELECT',projectname FROM productdetail,其中productdetail.employeeid=employeedetail.employeeid作为XML路径1,1,作为productdetail内部的abc在productdetail.employeeid=employeedetail.employeeid组中加入employeedetail.firstname,employeedetail.employeeid具有countproductdetail.projectname>1,它在子查询中分别为我提供项目详细信息,而对于firstname,我使用的是主查询,但在组合这两个查询时提供错误如果要显示firstname、计数值,可以。。但把名字放在小组里。