日期:2014-05-17  浏览次数:20787 次

急求:一个简单的分组查询语句!
查询每个部门的最高工资,并添加该员工的名字
我是这样写的
select max(s1.salary),s2.last_name
from s_emp s1,s_emp s2
group by s1.dept_id,s2.last_name,s1.last_name
having s1.last_name=s2.last_name;
结果不对,把每个员工的都给查询出来了。我哪里错了?为什么
另外一个稍微难一点的

显示各门课程的考场数目和可容纳的考生
各数据表结构如下:
表1:课程表 TC
cid 课程id
cname 课程名
Ctype 考试方式
表2:考场表 TR
Roomed 考场id
address 考场地址
Contain 容纳人数
表3:考场课程对应表 TCR
cid 课程id
roomId 考场id
这个也是多表查询的,该如何查询?
------解决方案--------------------
问题一的原因:
    因为在group by 语句中,你是以部门名称和员工姓名进行分组的,所以就会把每个员工的姓名都查出来。
正确的做法是先按照部门名称进行分组,取出每个部门的部门名称和最高工资,然后再依据部门号和最高工资查员工姓名。
这说明,你对group by语句的理解有点欠缺。

SELECT S2.DEPT_ID, S2.LAST_NAME, S2.SALARY
  FROM S_EMP S2
 WHERE (S2.DEPT_ID, S2.SALARY) IN
       (SELECT S1.DEPT_ID, MAX(S1.SALARY) FROM S_EMP S1 GROUP BY S1.DEPT_ID)


问题二:
   我看问题二的本质就是要弄懂三个表之间该怎么关联,表1和表3用课程id进行关联,表2和表3之间用考场id关联。
用去重后的考场id做为课程的考场数目,用容纳人数的求和做为课程的可容纳考生
  select t1.cname  课程名称,count(distinct t3.roomld)  考场数目,
         sum(t2.contain) 可容纳的考生
  from tc t1,tr t2,tcr t3
  where t1.cid=t3.cid and t2.roomed=t3.roomld
group by t1.cname