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

急求:一个简单的分组查询语句!
查询每个部门的最高工资,并添加该员工的名字
我是这样写的
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 
------其他解决方案--------------------
1、
select  dept_id,last_name,salary
from s_emp
where (salary,dept_id) in (select max(salary),deot_id from emp group by dept_id);
------其他解决方案--------------------

--问题1
select * from (
select s1.*, row_number() over (partition by dept_id order by salary desc) rn
  from s_emp s1) where rn=1;

--问题2
select cname, count(cname) as 考场数目, sum(contain) as 可容纳的考生 from(
select * from tcr
  left join tc on tcr.cid=tc.cid
  left join tr on tcr.roomid=tr.roomid);

------其他解决方案--------------------
2、 我也不知道对不对  没有数据验证
 select tc.cid,count(tcr.roomid),tr.contain from tc,tr,tcr
 where tc.cid=tcr.cid and tr.roomid=tcr.roomid
 group by tc.cid ,tr.contain
------其他解决方案--------------------


---tc\\\
       CID CNAME
---------- ----------
         1 yingyu
         2 math
         3 law


----tr\\\
    ROOMID    CONTAIN
---------- ----------
         1         10
         2         20
         3         30

---tcr\\\

      CID     ROOMID