Получение результата sum / count с двумя разными условиями - PullRequest
1 голос
/ 04 мая 2020

Я пытался извлечь в среднее время (на основе некоторых критериев). Мне нужно получить два результата. Эти два результата основаны на количестве минут между двумя делениями, деленном на количество регистров в таблице. Итак, это в основном так:

select round(sum(a.dt_atend_medico-a.dt_entrada)/count(a.nr_atendimento),0)tempopsa
from atendimento_paciente a JOIN atend_paciente_unidade b ON a.nr_atendimento = b.nr_atendimento AND b.nr_sequencia = 1
JOIN setor_atendimento c ON b.cd_setor_atendimento = c.cd_setor_atendimento
where c.cd_setor_atendimento = 65
and a.dt_cancelamento IS NULL
AND a.dt_alta IS NULL
AND a.ie_tipo_atendimento = 3
AND a.dt_entrada between (sysdate)-1/24 and sysdate

Мне нужно извлечь второй результат, и единственное другое значение - это "c .cd_setor_atendimento", то есть 66. Я пытался использовать case, когда, но тогда это заставляет меня группировать результаты:

SELECT case when a.dt_atend_medico is not null and c.cd_setor_atendimento = 65 then
round(sum(Obter_min_entre_datas(a.dt_entrada, a.DT_ATEND_MEDICO,0))/count(a.nr_atendimento),0) end as tempopsa,
case when a.dt_atend_medico is not null and c.cd_setor_atendimento = 66 then
round(sum(Obter_min_entre_datas(a.dt_entrada, a.DT_ATEND_MEDICO,0))/count(a.nr_atendimento),0) end as tempopsi
from atendimento_paciente a JOIN atend_paciente_unidade b ON a.nr_atendimento = b.nr_atendimento AND b.nr_sequencia = 1
JOIN setor_atendimento c ON b.cd_setor_atendimento = c.cd_setor_atendimento
where 
a.dt_cancelamento IS NULL
AND a.dt_alta IS NULL
AND a.ie_carater_inter_sus = 02
AND a.ie_tipo_atendimento = 3
AND a.dt_entrada between (sysdate)-1/24 and sysdate

Это дает мне ORA-00937: не групповую функцию для одной группы 00937. 00000 - "не групповую функцию для одной группы"

Какие-либо советы, чтобы получить эти два значения с различными параметрами? (Мне нужно получить отдельные значения, поэтому я не могу использовать UNION между двумя выборами)

Спасибо!

1 Ответ

1 голос
/ 04 мая 2020

Концепция условного агрегирования, которую вы пытаетесь выполнить, заключается в том, чтобы поместить case выражения в агрегатных функций, а не вокруг них, а остальная часть вашего запроса остается неизменной:

select
    round(
        sum(
            case when a.dt_atend_medico is not null and c.cd_setor_atendimento = 65 
            then Obter_min_entre_datas(a.dt_entrada, a.DT_ATEND_MEDICO,0) end
        )
        / count(
            case when a.dt_atend_medico is not null and c.cd_setor_atendimento = 65 
            then a.nr_atendimento end
        ), 0) as tempopsa,
    round(
        sum(
            case when a.dt_atend_medico is not null and c.cd_setor_atendimento = 66 
            then Obter_min_entre_datas(a.dt_entrada, a.DT_ATEND_MEDICO,0) end
        )
        / count(
            case when a.dt_atend_medico is not null and c.cd_setor_atendimento = 66 
            then a.nr_atendimento end
        ), 0) as tempopsi
from ...
...