使用 Count/group by in case 表达式

问题描述 投票:0回答:2

我试图显示该工作人员担任的所有工作职位(“代班老师”除外) - 如果该工作人员担任多个工作职位。并出示副课老师是否是老师(工作人员只持有副课老师一个职称)。

我使用了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

我对上面的代码有两个问题-

  1. Count 和 groupBy 给出子查询返回多个值的错误。
  2. 我只想使用 STUFF() 显示除助教老师之外的工作人员所担任的职位 - 这是他们所担任的不同职位。但我不能排除“临时老师”(当他们拥有多个职位时)
sql sql-server
2个回答
1
投票

分组依据给出了多个记录的计数,并且您没有逐行过滤同一用户,

所以请使用以下内容:- 我创建了一个内存表来显示一些结果,你不需要这部分

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
  • S2只是一名代课老师
  • S1 有一组职位,包括我们排除的“临时老师”
  • S3 有一个但没有“救济” 老师

希望有帮助。


1
投票

您不关联子查询,即返回所有员工的结果,而不仅仅是当前员工的结果。

要检查某个工作人员是否只是代课老师,您还可以只检查他们的角色的最小和最大角色是否相等并且是代课老师。在获取职位列表的子查询中,只需在

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;
© www.soinside.com 2019 - 2024. All rights reserved.