雇佣的聚合函数couting times

时间:2013-03-17 14:36:41

标签: sql join oracle11g aggregate-functions

我正在使用HR表架构,我有一个练习说明:

job_history可以包含多个被雇用多次的员工的条目。创建查询以检索多次雇用的员工列表。包括列EMPLOYEE_IDLAST_NAMEFIRST_NAME和汇总"Times Hired"

到目前为止,我做了什么:

select e.employee_id, e.last_name, e.first_name,
       count (start_date) as Times_Hired
from job_history jH, employees e
WHERE e.employee_id=jH.employee_id
group by e.employee_id, e.last_name, e.first_name;

现在,我的问题是:

  • 整个事情应该是子查询吗?
  • 哪些列连接表job_historyemployees

因为当我运行它时,它只显示一些员工。

1 个答案:

答案 0 :(得分:2)

您可以(并且应该)使用显式ANSI JOIN语法重写查询以使其清晰:

SELECT employee_id, e.last_name, e.first_name,
       count (*) AS Times_Hired
FROM   employees   e 
JOIN   job_history j USING (employee_id)
GROUP  BY employee_id, e.last_name, e.first_name
HAVING count (*) > 1;

我还使用LEFT [OUTER] JOIN将结果中的员工包括在job_history(还)中没有任何行。
这是不相关的,因为您只对员工感兴趣..

  

比不止一次雇用

我用HAVING count (*) > 1实现了这个条件。

至于你的第二个问题:很明显,employee_id是......

的专栏
  

连接表job_historyemployees

由于我们加入的列名(employee_id)在两个表格中都相同,我简化为equi-join with USING

我使用count(*)代替count (start_date),因为尚未声明start_date是否NULL,在这种情况下它不会添加到计数中

关于你的第一个问题:不,你不需要这里的子查询。

JOIN

的备用ON语法
SELECT e.employee_id, e.last_name, e.first_name,
       count (*) AS Times_Hired
FROM   employees   e 
JOIN   job_history j ON j.employee_id = e.employee_id
GROUP  BY e.employee_id, e.last_name, e.first_name
HAVING count (*) > 1;

SQLfiddle中进行了测试。