2010-11-24 53 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

我喜欢,如果你从一个单一的statment – 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

这是我在写答案的核心要使用一个SQL视图...只是需要加入到翻译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