急求:一个简单的分组查询语句!
查询每个部门的最高工资,并添加该员工的名字
我是这样写的
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