2010-11-24 2 views
0

Мой SQL-fu слишком слаб для этого, и я даже не уверен, что это возможно в одном вызове SQL.Можно ли выбрать несколько условных счетчиков для трех таблиц в одном запросе SQL?

Учитывая У меня есть следующие таблицы:

PARTNER 
+----+--------+ 
| id | name | 
+----+--------+ 
| 1 | bloggs | 
| 2 | jones | 

PARTNER MANAGER 
+----+--------------+------+ 
| id | partner_id | name | 
+----+--------------+------+ 
| 1 | 1   | fred | 
| 2 | 2   | dave | 

COMPANY 
+----+--------------------+--------+----------+ 
| id | partner_manager_id | name | active | 
+----+--------------------+--------+----------+ 
| 1 | 1     | comp1 | true  | 
| 2 | 1     | comp2 | false | 
| 3 | 2     | comp3 | true  | 
| 4 | 2     | comp4 | true  | 
| 5 | 2     | comp5 | true  | 
| 6 | 2     | comp6 | true  | 

которые я хотел бы, чтобы вывести следующий за один вызов SQL:

+--------------+--------------------+----------------------+ 
| partner_name | n_active_companies | n_inactive_companies | 
+--------------+--------------------+----------------------+ 
| bloggs  | 1     | 1     | 
| jones  | 4     | 0     | 

я могу присоединиться три таблицы, используя два LEFT JOINs, но как Я могу агрегировать подсчеты (с или без предложения WHERE) ускользает от меня.

Я так лаяю неправильное дерево, так сказать?

+0

я предпочитаю использовать представление SQL, если вы хотите от одного даного – Sudantha 2010-11-24 12:54:20

ответ

2

Это заставляет вас большую часть пути туда:

SELECT 
    partner_manager_id, 
    SUM(CASE WHEN active THEN 1 ELSE 0 END) AS n_active_companies, 
    SUM(CASE WHEN active THEN 0 ELSE 1 END) AS n_inactive_companies 
FROM COMPANY 
GROUP BY partner_manager_id 

Остальная часть вашего вопроса, в основном спрашивают, как присоединиться к этому результату для остальных таблиц. Как вы указываете, для этого используйте JOIN.

SELECT 
    PARTNER.name, 
    T1.n_active_companies, 
    T1.n_inactive_companies 
FROM 
PARTNER 
LEFT JOIN PARTNER_MANAGER ON partner_id = PARTNER.id 
LEFT JOIN 
(
    SELECT 
     partner_manager_id, 
     SUM(CASE WHEN active THEN 1 ELSE 0 END) AS n_active_companies, 
     SUM(CASE WHEN active THEN 0 ELSE 1 END) AS n_inactive_companies 
    FROM COMPANY 
    GROUP BY partner_manager_id 
) T1 
ON T1.partner_manager_id = PARTNER_MANAGER.id 
+0

Этого ядра ответа я писал ... просто нужно стыки перевести partner_manager_id к партнеру. имя – chezy525 2010-11-24 13:01:45

0
select p.name "Partner Name" 
, c1.cnt "n_active_companies" 
, c2.cnt "n_inactive_companies" 
from partner p 
, (select partner_manager_id id, count(partner_manager_id) cnt from company where active = 'true' group by partner_manager_id) c1 
, (select partner_manager_id id, count(partner_manager_id) cnt from company where active = 'false' group by partner_manager_id) c2 
where c1.id = p.id 
and c2.id = p.id 
0
select p.name as 'partner_name', 
     sum(case when active then 1 else 0) as 'n_active_companies', 
     sum(case when active then 0 else 1) as 'n_inactive_companies' 
from COMPANY c 
    join PARTNER_MANAGER pm on c.partner_manager_id = pm.id 
    join PARTNER p on pm.partner_id = p.id 
group by p.name 
Смежные вопросы