是否可以在单个SQL查询中跨三个表选择多个条件计数?

时间:2010-11-24 12:50:06

标签: sql

我的SQL-fu太弱了,我甚至不确定在一次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子句)是我的意思。

我咆哮着错误的树,可以这么说吗?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

答案 2 :(得分: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