Использовать условную агрегацию. Логика, которая решает, будем ли мы печатать количество записей или их значение, не интуитивна, но я бы сформулировал это следующим образом:
select
studentId,
case when sum(case when foodtype = 1 then 1 else 0 end) = 1
then max(case when foodtype = 1 then foodId end)
else sum(case when foodtype = 1 then 1 else 0 end)
end MorningFoodCountOrId
case when sum(case when foodtype = 2 then 1 else 0 end) = 1
then max(case when foodtype = 2 then foodId end)
else sum(case when foodtype = 2 then 1 else 0 end)
end EveningFoodCountOrId
from mytable
group by studentId
Ваша RDMBS должна быть в состоянии оптимизировать запрос, не вычисляя условные суммыдважды.
Примечание: вы не указали, какую RDMBS вы используете. Если это MySQL, то можно немного сократить условные суммы следующим образом:
select
studentId,
case when sum(foodtype = 1) = 1
then max(case when foodtype = 1 then foodId end)
else sum(foodtype = 1)
MorningFoodCountOrId
case when sum(foodtype = 2) = 1
then max(case when foodtype = 2 then foodId end)
else sum(foodtype = 2)
EveningFoodCountOrId
from mytable
group by studentId