使用所需的连接计数查询

时间:2014-07-23 17:46:50

标签: sql

我有桌子

Dept

DEPTNO  DNAME   LOC
10  ACCOUNTING  NEW YORK
20  RESEARCH    DALLAS
30  SALES   CHICAGO
40  OPERATIONS  BOSTON

和另一个表

Emp

EMPNO   ENAME   JOB          MGR    HIREDATE    SAL     COMM    DEPTNO
7369    SMITH   CLERK       7902    12/17/1980  800     NULL     20
7499    ALLEN   SALESMAN    7698    2/20/1981   1600    300      30
7521    WARD    SALESMAN    7698    2/22/1981   1250    500      30
7566    JONES   MANAGER     7839    4/2/1981    2975    NULL     20
7654    MARTIN  SALESMAN    7698    9/28/1981   1250    1400     30
7698    BLAKE   MANAGER     7839    5/1/1981    2850    NULL     30
7782    CLARK   MANAGER     7839    6/9/1981    2450    NULL     10
7788    SCOTT   ANALYST     7566    12/9/1982   3000    NULL     20
7839    KING    PRESIDENT   NULL    11/17/1981  5000    NULL     10
7844    TURNER  SALESMAN    7698    9/8/1981    1500    0        30
7876    ADAMS   CLERK       7788    1/12/1983   1100    NULL     20
7900    JAMES   CLERK       7698    12/3/1981   950     NULL     30
7902    FORD    ANALYST     7566    12/3/1981   3000    NULL     20
7934    MILLER  CLERK       7782    1/23/1982   1300    NULL     10

我的问题:列出所有部门名称及其员工人数。计数应仅包括雇用日期大于1981年的雇员

结果:应该是这样的

DNAME       EMPCOUNT
ACCOUNTING    1
OPERATIONS    0
RESEARCH      2
SALES         0

4 个答案:

答案 0 :(得分:2)

SELECT    dname,
          SUM(CASE WHEN emp.hierdate > '1981/01/01' THEN 1 ELSE 0 END)
FROM      dept 
LEFT JOIN emp ON dept.deptno = emp.empno
GROUP BY  dname

答案 1 :(得分:1)

试试这段代码:

SELECT Dept.DNAME, COUNT(Emp.EMPNO) 
FROM Dept LEFT JOIN Emp ON Dept.DEPTNO = Emp.DEPTNO
WHERE Emp.HIREDATE > '1981/01/01'
GROUP BY Dept.DNAME

答案 2 :(得分:1)

为了让部门拥有0个匹配的员工,这需要一些技巧

   SELECT Dept.DNAME, COALESCE(t.cnt, 0) AS count
     FROM Dept 
LEFT JOIN (  SELECT deptno, count(*)
               FROM Emp
              WHERE HIREDATA > '1981/01/01'
           GROUP BY deptno) as t
       ON t.deptno = Dept.deptno

答案 3 :(得分:0)

首先,了解如何加入(了解inner joinleft joinright join)。

一旦你有了这个,你应该能够写出这样的查询:

-- First example
select dept.dname, count(emp.empId)
from dept left join emp on dept.deptNo = emp.deptNo
group by dept.dname;

或者这个:

-- Second example
select dept.dname, sum(case when emp.empId is not null then 1 else 0 end)
from dept left join emp on dept.deptNo = emp.deptNo
group by dept.dname;

检查SQL fiddle example