Проверьте результат нескольких выражений - PullRequest
0 голосов
/ 22 апреля 2020

У меня есть выражение case внутри агрегатной функции в операторе выбора, которое выглядит примерно так:

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 table

Теперь, как мне проверить, возвращает ли все случаи 0.0? Чтобы я мог исключить его из набора результатов?

Ответы [ 2 ]

1 голос
/ 22 апреля 2020

Я бы просто добавил предложение where:

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 table
where status in ('approved', 'cancelled', 'forwarded')
group by person_id;

В качестве бонуса это может улучшить производительность, если у вас много строк с другими статусами.

В качестве альтернативы вы можете добавить предложение having к вашему запросу:

having sum(case when status in ('approved', 'cancelled', 'forwarded') then 1 else 0 end) > 0
0 голосов
/ 22 апреля 2020

Простейший подход, вероятно, состоит в том, чтобы превратить ваш запрос в подзапрос, а затем отфильтровать во внешнем запросе:

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.

...