SQL-запрос с MAX и CASE WHEN - PullRequest
       2

SQL-запрос с MAX и CASE WHEN

0 голосов
/ 17 июня 2019

У меня есть следующий запрос 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 я хочу выбрать максимум maxStdsID с clsLimit равным 1. Если нет maxStdsID с clsLimit равным 1, то я бы хотел выбрать максимальное значение maxStdsID с clsLimit равным 0

Я попробовал то же самое с приведенной ниже логикой

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 ]

2 голосов
/ 17 июня 2019

Вы рядом.,,но используйте 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, а не вторая таблица.

0 голосов
/ 17 июня 2019

Вы можете попробовать:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...