使用MAX和CASE的SQL查询

时间:2019-06-17 18:22:51

标签: sql sql-server

我有以下SQL查询,其输出如下所示:

select stds.classID as classID, stds.clsLimit as clsLimit
  , max(stds.id)as maxStdsID  
from class cls 
left outer join students stds
on cls.id = stds.classID
group by stds.classID,stds.clsLimit

enter image description here

对于每个classID,我要选择clsLimit为1的maxStdsID的最大值。 如果没有将clsLimit设置为1的maxStdsID,那么我想选择将clsLimit设置为0的maxStdsID的最大值

我尝试了以下逻辑

select stds.classID as classID
  , max(CASE WHEN stds.clsLimit = 1 then stds.id else stds.id end) as maxStdsID  
from class cls 
left outer join students stds
on cls.id = stds.classID
group by stds.classID

我没有得到想要的输出。

2 个答案:

答案 0 :(得分:2)

您很近。 。 。但使用coalesce()

select cls.classID,
       coalesce(max(case when stds.clsLimit = 1 then stds.id end),
                max(case when stds.clslimit = 0 then stds.id end)
               ) as maxStdsID  
from class cls left outer join
     students stds
     on cls.id = stds.classID
group by cls.classID;

如果没有“ 1”的值,那么它将获得“ 0”的最大值。

请注意,我更改了聚合列,以使用left join第一个表中的列,而不是第二个表中的列。

答案 1 :(得分:0)

您可以尝试:

select stds.classID as classID ,  stds.clsLimit as clsLimit , 
max(stds.id)as maxStdsID  
from class cls 
left outer join students stds
on cls.id = stds.classID
where stds.clsLimt = CASE WHEN stds.clsLimit = 1 then 1 ELSE 0 END
group by stds.classID,stds.clsLimit