Простейший подход, вероятно, состоит в том, чтобы превратить ваш запрос в подзапрос, а затем отфильтровать во внешнем запросе:
select *
from (
select person_id,
sum(case status = 'approved' then hours else 0.0 end) as hours
sum(case status = 'cancelled' then void_hrs else 0.0 end) as void_hrs
sum(case status = 'forwarded' then fwd_hrs else 0.0 end) as fwd_hrs
from mytable
group by person_id
) t
where hours + void_hrs + fwd_hrs > 0
Обратите внимание, что в исходном запросе отсутствует предложение group by
, я добавил это.
В качестве альтернативы можно использовать длинное предложение having
:
select person_id,
sum(case status = 'approved' then hours else 0.0 end) as hours
sum(case status = 'cancelled' then void_hrs else 0.0 end) as void_hrs
sum(case status = 'forwarded' then fwd_hrs else 0.0 end) as fwd_hrs
from mytable
group by person_id
having sum(
case status
when 'approved' then hours
when 'cancelled' then void_hrs
when 'forwarded' then fwd_hrs
else 0.0
end
) > 0
Примечание: это называется case
выражением , а не регистром заявление . Последний является структурой управления потоком, тогда как первый является условной логикой c.