Sql 聚合函数计算时间

Sql 聚合函数计算时间,sql,join,oracle11g,aggregate-functions,Sql,Join,Oracle11g,Aggregate Functions,我正在使用HR表格模式,其中我有一个练习说明: 对于一名被雇佣多次的员工,工作历史记录可以包含多个条目。创建一个查询以检索多次雇用的员工列表。包括EMPLOYEE\u ID、LAST\u NAME、FIRST\u NAME列和合计“雇用次数” 到目前为止,我所做的是: select e.employee_id, e.last_name, e.first_name, count (start_date) as Times_Hired from job_history jH, empl

我正在使用HR表格模式,其中我有一个练习说明:

对于一名被雇佣多次的员工,
工作历史记录可以包含多个条目。创建一个查询以检索多次雇用的员工列表。包括
EMPLOYEE\u ID
LAST\u NAME
FIRST\u NAME
列和合计
“雇用次数”

到目前为止,我所做的是:

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;
现在,我的问题是:

  • 整个过程应该是一个子查询吗
  • 哪些列连接表
    工作历史
    员工
因为当我运行此命令时,它只显示少数员工。

您可以(也应该)使用显式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;

都在中测试。

@user2145903:Update-啊,我的疏忽!一旦在使用
equi join中使用了限定符,就需要从
employee\u id
的所有实例中删除该限定符。另一种方法是在联接中使用普通的
ON
子句。我修正了这个问题,添加了alt和粗体强调。@user2145903:如果定义了
start\u date
notnull
(只要我们不使用
左连接即可)
count(*)
可能快一点,因为只需验证行的存在。顺便说一句:*是评论中的一个特殊字符,你需要用\*来避开它。大概你在回答问题时删除了所有问题的细节,这样教授就无法在谷歌上搜索你在哪里找到它们了?
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;