Sql 聚合函数计算时间
我正在使用HR表格模式,其中我有一个练习说明: 对于一名被雇佣多次的员工,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
工作历史记录可以包含多个条目。创建一个查询以检索多次雇用的员工列表。包括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;