如何使用SQL MAX(SUM())函数

时间:2013-10-30 00:36:09

标签: sql sum max sqlplus

我在SQL中使用SQL maxsum聚合函数需要一些帮助。

我想显示在项目中投入最多总时数的员工的名字和姓氏。我想列出项目总时间最长的员工。

我有两张桌子:

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))不起作用,什么能给我正确的结果?

6 个答案:

答案 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;

请测试并确认(或不确认),我想知道这是否有效。