我不明白为什么我的解决方案不起作用。
我正试图在数据库中按部门统计雇员人数。
有两张桌子:

CREATE TABLE DEPARTMENT
(
    NAME VARCHAR(32) NOT NULL,
    ID INT NOT NULL PRIMARY KEY
);

CREATE TABLE EMPLOYEE
(
    NAME VARCHAR(32) PRIMARY KEY NOT NULL,
    DEPARTMENT INT NOT NULL REFERENCES DEPARTMENT(ID)
);

我还创建了一个视图来显示部门中的员工数量。
CREATE
OR REPLACE VIEW VIEW_NB AS
SELECT
   DEPARTMENT.NAME AS DEPARTEMENT,
   count(*) AS nb
FROM
   DEPARTMENT
   LEFT JOIN
      EMPLOYEE
      ON DEPARTMENT.ID = EMPLOYEE.DEPARTMENT
GROUP BY
   DEPARTMENT.ID,
   DEPARTMENT.NAME;
SELECT
   ADD_DEPARTMENT('FRANCE', 10);
SELECT
   ADD_DEPARTMENT('SPAIN', 100);
SELECT
   ADD_EMPLOYEE('JOSE', 10);

结果是
 departement | nb
-------------+----
 FRANCE      |  1
 SPAIN       |  1

但应该是
 departement | nb
-------------+----
 FRANCE      |  0
 SPAIN       |  1

我理解使用左连接的必要性。
然而,我的观点是,每个部门至少有一名员工,即使他们没有员工。
我错过什么了吗?如果是什么?

最佳答案

这应该有效:

SELECT DEPARTMENT.NAME AS DEPARTEMENT, count(EMPLOYEE.DEPARTMENT) AS nb
FROM DEPARTMENT
LEFT JOIN EMPLOYEE
ON DEPARTMENT.ID = EMPLOYEE.DEPARTMENT
GROUP BY DEPARTMENT.ID, DEPARTMENT.NAME;

将1作为计数的原因是您使用了*,这意味着-将任何记录都计为1,无论数据如何。COUNT()默认情况下忽略NULL,因此您只需在其中提供一个右(详细)表列。

关于sql - 求和并加入SQL,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40403295/

10-08 22:59