Оператор множественного выбора с использованием COUNT - PullRequest
2 голосов
/ 05 ноября 2010

Я пытаюсь объединить эти два запроса на выборку, но функция count сбивает меня с толку с Oracle:

select person.first_name, COUNT(person.PERSON_ID) as Active
FROM incident, person
where person.PERSON_ID = incident.OWNER_ID
and incident.incident_id = 1
AND (incident.dept_id = 111 OR incident.dept_id = 222)
GROUP BY person.first_name;


select person.first_name, COUNT(person.PERSON_ID) as NonActive
FROM incident, person
where person.PERSON_ID = incident.OWNER_ID
AND incident.incident_id = 2
AND (incident.dept_id = 111OR incident.dept_id = 222)
GROUP BY person.first_name

Я пытаюсь вернуть один результат как:

FIRST_NAME ACTIVE NonActive
Bob          5       11
John         3       14

Каков наилучший (эффективный) способ сделать это?

Ответы [ 2 ]

3 голосов
/ 05 ноября 2010

Вот два способа сделать это. Я уверен, что SUM CASE будет лучше, но вы можете проверить это сами

Использование SUM CASE

select person.first_name, 
SUM(case when incident.incident_id =1 THEN 1 ELSE 0 END) as Active,
SUM(case when incident.incident_id =2 THEN 1 ELSE 0 END) AS NonActive,

FROM incident, person
where person.PERSON_ID = incident.OWNER_ID

   AND (incident.dept_id = 111 OR incident.dept_id = 222)
   AND incident.incident_id IN (1,2)

GROUP BY person.first_name;

Использование JOIN

SELECT  DISTINCT
    p.First_name,
    Acive.Active,
    NonActive.NonActive
FROM
PERSON p

LEFT JOIN 
(
select person.first_name, COUNT(person.PERSON_ID) as Active
FROM incident, person
where person.PERSON_ID = incident.OWNER_ID
and incident.incident_id = 1
AND (incident.dept_id = 111 OR incident.dept_id = 222)
GROUP BY person.first_name;
) Active
ON p.first_name = active.first_name
LEFT JOIN 
(
select person.first_name, COUNT(person.PERSON_ID) as NonActive
FROM incident, person
where person.PERSON_ID = incident.OWNER_ID
AND incident.incident_id = 2
AND (incident.dept_id = 111OR incident.dept_id = 222)
GROUP BY person.first_name
) NonActive

ON p.first_name = NonActive.first_name

where Active.First_name is not null
and NonActive.First_name is not null
0 голосов
/ 05 ноября 2010

Я полагаю, что вы хотите рассчитывать на инцидент_ид, а не на личность; Таким образом, вы можете объединить два запроса в один и получить желаемый результат.

...