【问题标题】:How to count zero results in COUNT aggregate across multiple tables?如何在多个表的 COUNT 聚合中计算零结果?
【发布时间】:2018-07-08 19:42:44
【问题描述】:

我有 3 个示例表: 1. 人

PID         PNAME                         
----------- ------------------------------
111111111.  James Brock
222222222.  Dean Sampson
333333333.  Adam Klein
444444444.  Sam Toggle
  1. 公司

    CID CNAME


    1. A公司
    2. 公司B
    3. C公司
    4. D公司
  2. 工作

    PID CNAME


    1. 公司B
    2. A公司
    3. A公司
    4. C公司

我想显示每家公司的员工人数,包括那些没有任何员工的员工(即:0 人)

所以到目前为止我有这个:

SELECT CNAME, COUNT(*) as EMPLOYEES
    FROM PERSON P, WORKING W, COMPANY C
    WHERE P.PID = W.PID
        AND W.CNAME = C.CNAME
    GROUP BY CNAME;

返回:

CNAME       EMPLOYEES                         
----------- ------------------------------
Company A   2
Company B   1
Company C   1

请注意,D 公司不见了

我想要这个:

CNAME       EMPLOYEES                         
----------- ------------------------------
Company A   2
Company B   1
Company C   1
Company D   0

有没有我可以采取的方法来获得我想要的结果?我在网上找到的所有其他示例仅使用 2 个表进行匹配。

【问题讨论】:

  • 工作中的 PID 与实际的不对应。工作表将不包含 cname,而是包含 cid。只有这样你才需要加入三个表。

标签: sql database db2 aggregate-functions


【解决方案1】:

永远不要FROM 子句中使用逗号。 始终使用正确、明确的JOIN 语法。然后,LEFT JOIN 就很明显了。

SELECT C.CNAME, COUNT(W.PID) as EMPLOYEES
FROM COMPANY C LEFT JOIN
     WORKING W
     ON W.CNAME = C.CNAME
GROUP BY C.CNAME;

请注意,JOINPERSON 是不必要的。你只是在数人,而不是查他们的名字。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-11
    • 1970-01-01
    • 2020-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-19
    相关资源
    最近更新 更多