我试图显示该工作人员担任的所有工作职位(“代班老师”除外) - 如果该工作人员担任多个工作职位。并出示副课老师是否是老师(工作人员只持有副课老师一个职称)。
我使用了case表达式,然后在其中使用了Select语句,该语句使用了group by,以便统计该员工担任的职位数量。但我收到一条错误消息,指出子查询返回了超过 1 个值。 另外,当我使用
STUFF()
功能显示所有工作职位时,我试图从工作职位中排除“Relief Teacher”。但我无法做到这一点。
第二个 When in Case 语句将显示使用 STUFF
时的所有职位。它并不排除临时教师的头衔。
SELECT jobpositions.staffid,
jobpositions.StaffNameExternal,
(Case when ((select Count(StaffId) from dbo.vStaffJobPositions group by staffid) =1 and (jobpositiondescription like 'Relief Teacher'))
then 'Relief Teacher'
when ((select Count(StaffId) from dbo.vStaffJobPositions group by staffid) >1 )
then (STUFF((SELECT ' / ' + JobPositionDescription
FROM dbo.vStaffJobPositions
FOR XML PATH('')),1,3, ''))
end) as StaffPosition
FROM dbo.vStaffJobPositions JobPositions
我对上面的代码有两个问题-
分组依据给出了多个记录的计数,并且您没有逐行过滤同一用户,
所以请使用以下内容:- 我创建了一个内存表来显示一些结果,你不需要这部分
Declare @vStaffJobPositions table(
staffid int,
StaffNameExternal varchar(max),
jobpositiondescription varchar(max)
)
这里添加了一些测试数据,因为您没有提供任何数据
insert into @vStaffJobPositions values
(1,'S1','Relief Teacher'),
(1,'S1','somthing else1'),
(1,'S1','somthing else2'),
(1,'S1','somthing else3'),
(1,'S1','Relief Teacher'),
(2,'S2','Relief Teacher'),
(3,'S3','somthing else1')
您可以使用的SQL部分如下,只需将表名更改为您的即可。
select distinct
staffid
,StaffNameExternal
,case when (select COUNT(*) from @vStaffJobPositions c where c.staffid=x.staffid and jobpositiondescription like 'Relief Teacher')=1
then 'Relief Teacher'
else STUFF((SELECT ' / ' + JobPositionDescription FROM @vStaffJobPositions a
where x.staffid=a.staffid and a.jobpositiondescription<>'Relief Teacher' FOR XML PATH('')),1,3, '')
end as StaffPosition
from @vStaffJobPositions x
对于上述结果如下:-
staffid StaffNameExternal StaffPosition
1 S1 somthing else1 / somthing else2 / somthing else3
2 S2 Relief Teacher
3 S3 somthing else1
希望有帮助。
您不关联子查询,即返回所有员工的结果,而不仅仅是当前员工的结果。
要检查某个工作人员是否只是代课老师,您还可以只检查他们的角色的最小和最大角色是否相等并且是代课老师。在获取职位列表的子查询中,只需在
WHERE
子句中过滤掉替补教师即可。
SELECT jp1.staffid,
jp1.staffnameexternal,
CASE
WHEN min(jp1.jobpositiondescription) = max(jp1.jobpositiondescription)
AND max(jp1.jobpositiondescription) = 'Relief Teacher' THEN
max(jp1.jobpositiondescription)
ELSE
stuff((SELECT ' / ' + jp2.jobpositiondescription
FROM dbo.vstaffjobpositions jp2
WHERE jp2.staffid = jp1.staffid
AND jp2.jobpositiondescription <> 'Relief Teacher'
FOR XML
PATH ('')),
1,
3,
'')
END staffposition
FROM dbo.vstaffjobpositions jp1
GROUP BY jp1.staffid,
jp1.staffnameexternal;