3

我需要一些使用 SQLmax和SQL 中的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))不起作用,什么会给我正确的结果?

4

6 回答 6

15

如果要使用聚合函数,则需要使用 group by 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 子句中的子查询会导致巨大的性能损失。

于 2013-10-30T01:29:09.283 回答
2
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 让我走上正轨。

于 2013-10-30T17:42:18.600 回答
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;

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

于 2013-10-31T13:12:29.560 回答
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
于 2013-10-30T00:52:58.600 回答
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
于 2013-10-30T00:54:34.540 回答
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 临时表,然后对其进行最大值

于 2013-10-30T01:02:32.333 回答