2013-10-30 749 views
0

我需要使用SQL在SQL sum聚合函数一些帮助max和。如何使用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

你需要FNAME,lname'聚集函数添加一个'组...和'ORDER BY L-NAME,总和(小时)desc' ...我不认为'MAX(总和(小时))'作品,尽管 –

+0

您使用了哪个数据库? –

+0

抱歉,这是SQL加 – abd9344

回答

1

您需要通过,如果你要使用使用一组集合函数sum

像这样的东西;

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子句中的子查询会引起巨大的性能损失。

+0

谢谢你,我不得不做一些小的调整,但你是对的钱。再次感谢! – abd9344

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 
+0

选择'essn'不太可能奏效,因为它既不是聚合也不是'group by'列。 –

+0

这是正确的语法,但它列出所有员工姓名,而不是只列出具有最大总项目小时数的员工。这是什么让我绊倒,我只需要最大(总和(小时)),但这不是一个有效的功能。 – abd9344

+0

所以你只需要顶级人物吧?或顶级人物? –

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

基本上你先建立和临时表,然后做一个最大它

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让我走上正轨。

0

如果我收到了你的问题的权利(你需要在项目中的一个“最佳harworking”的人),我相信未来的查询应该这样做(具有最佳性能比较):

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; 

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