我在SQL中使用SQL max
和sum
聚合函数需要一些帮助。
我想显示在项目中投入最多总时数的员工的名字和姓氏。我想列出项目总时间最长的员工。
我有两张桌子:
employee:
FNAMEM--LNAME--SSN--BDATE--ADDRESS--SALARY--SUPERSSN--DNO
works_on:
ESSN--PROJECT_NUM--HOURS
这是我到目前为止,但代码中存在语法错误:
select fname, lname, max(sum(hours)) "Total Hours", essn
from employee, works_on
where essn = ssn
order by lname;
我知道max(sum(hours))
不起作用,什么能给我正确的结果?
答案 0 :(得分:3)
如果要使用聚合函数sum
,则需要使用group by。
像这样;
SELECT s.fname, s.lname
FROM (SELECT fname, lname, SUM(w.hours) SumHours, w.project_num
FROM Emplyee e
JOIN Works_on w ON w.essn = e.ssn
GROUP BY e.fname, e.lname, w.project_num) s
WHERE s.SumHours = (SELECT MAX(w.hours) MaxSum
FROM Works_on w1
WHERE w1.project_num = s.project_num)
请注意,where子句中嵌入的子查询会引起严重的性能损失。
答案 1 :(得分:1)
SELECT s.fname, s.lname
FROM (SELECT fname, lname, SUM(w.hours) SumHours
FROM employee e
JOIN works_on w ON w.essn = e.ssn
GROUP BY e.fname, e.lname) s
WHERE s.SumHours = (SELECT MAX(hours) MaxSum
FROM works_on w1);
这段代码对我有用;感谢用户:PM 77-1让我走上正轨。
答案 2 :(得分:0)
试试这个:http://sqlfiddle.com/#!2/e4f9e/2/0
select emp_hours.*
from ( select ssn, lname, fname,
sum(hours) as total_hours
from emp as e
join wo as w on e.ssn = w.essn
group by ssn, lname, fname ) as emp_hours
join ( select essn,
sum(hours) as sum_hours
from wo
group by essn
order by sum_hours desc
limit 1) as hours_by_emp
on emp_hours.total_hours = hours_by_emp.sum_hours
答案 3 :(得分:0)
试试这个:
SELECT e.fname, e.lname, w.total_hours, e.ssn,
rank() over (order by w.total_hours desc) as rnk
FROM employee e INNER JOIN
(SELECT essn, SUM(hours) total_hours
FROM works_on
GROUP BY essn) w
ON e.ssn = w.essn
where rnk = 1
答案 4 :(得分:0)
为了简单起见,我只需在单独的查询中获取最大值,然后使用第二个查询来获取总和与最大值匹配的那些查询。从第一个查询中检索的数据是单个数字,因此开销很小。如果构造单个查询,则数据库无法进行更多优化。唯一的缺点是第一次查询完成和第二次查询开始之间的延迟。
忽略以下内容,它做错了。
类似:
select fname, lname, max(sum_hours) "Total Hours", essn
from (select fname, lname, sum(hours) sum_hours from employee, works_on
where essn = ssn group by fname, lname, works_on)
group by fname, lname
order by lname;
基本上你首先构造sum临时表,然后对它做一个最大值
答案 5 :(得分:0)
如果我的问题是正确的(你需要一个“最好的勤奋”的人),我相信下一个查询应该这样做(具有最好的性能):
SELECT FNAMEM, LNAME, TotalHours
FROM (
SELECT PROJECT_NUM, ESSN, MAX(HOURS) TotalHours
FROM works_on
GROUP BY PROJECT_NAME
) mx
JOIN
employee
ON SSN = ESSN
ORDER BY LNAME;
请测试并确认(或不确认),我想知道这是否有效。