几个SQL语句的题

wjmsino 2007-09-07 08:09:32
1 有一个员工表(S_EMP)有栏位last_name(姓名),salary(薪水),DEPT_ID (部门ID)等
A : 找出公司里收入最高的前三名员工
B : 找出那些工资高于他们所在部门的平均工资的员工

2 有一表
学生编号 姓名 科别 分数
1000 张三 语文 79
1000 张三 数学 100
1000 张三 外语 80
1001 李四 语文 83
1001 李四 数学 62
1001 李四 外语 90
如何得出如下表
学生编号 姓名 语文 数学 外语
1000 张三 79 100 80
1001 李四 83 62 90
请自行建立Table并写出上述转换的SQL
...全文
256 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
hebo2005 2007-09-10
  • 打赏
  • 举报
回复
上面句,我试验了,还是写错了,应该这样写
select deptnmae,avg(trunc(to_number((sysdate-birthdate))/365))
from a
group by deptname

这样出来的岁数都是整数,如果想四舍五入,就把trunc换成round,如果想保留2位小数,就这样写
avg(trunc(to_number((sysdate-birthdate))/365,2))

hebo2005 2007-09-09
  • 打赏
  • 举报
回复
b里面漏掉了个条件
select a.*
from a,
(select deptname ,min(birthdate) max
from a
where sex=女
group by deptname
) maxage
where sex=女 and a.deptname=maxage.deptname
and a.birhdate =maxage.max
hebo2005 2007-09-09
  • 打赏
  • 举报
回复
关于D
如果只有一直下属,你可这样建,如果有多个下属则肯定不行,需要建上属
建上属的查下属查法
select *
from a
start with Empno=领导编号
connect by prior Empno = Uempno

查上属查法
select *
from a
start with Empno=员工编号
connect by prior Uempno = Empno
hebo2005 2007-09-09
  • 打赏
  • 举报
回复
a
select deptnmae,avg(trunc(to_number(sysdate-birthdate))/365)
from a
group by deptname

b
select a.*
from a,
(select deptname ,min(birthdate) max
from a
group by deptname
) maxage
where a.deptname=maxage.deptname
and a.birhdate =maxage.max

c
select Empno,empname,sex,Uempno,Deptname,Birthdate,
decode(Offdate,null,'在职',decode(sign(sysdate-offdate),1,'离职',0,'离职',-1,'即将离职')) 在职情况, Salary
from a
其实你这个问题少了个离职日=于当前日的情况

d
你的表结构建错了吧,上下属就是父子结构,都是子结构对应父结构的,多个子对应一个父,你这里是倒过来,父结构对应子结构,意味着Uempno字段是多个下属编号组成的
这里应该是上属的编号

hebo2005 2007-09-09
  • 打赏
  • 举报
回复
xueying1123(正是在下) ( ) 信誉:100 2007-09-09 13:25:56 得分: 0


1题
a问:
SELECT top 3 * FROM Document order by salary desc

这样查询 如果前3名有并列的人 都可以查出来

===================================================
兄弟,没玩过ORACLE吧,TOP的写法在ORACLE是没有的,这句去执行,肯定报错的

顺便说一下
a
select deptnmae,avg(trunc(to_number(sysdate-birthdate))/365)
from a
group by deptname
这个括号要改一下
a
select deptnmae,avg(trunc((sysdate-birthdate))/365)
from a
group by deptname

不过这句最好试验下
xueying1123 2007-09-09
  • 打赏
  • 举报
回复
1题
a问:
SELECT top 3 * FROM Document order by salary desc

这样查询 如果前3名有并列的人 都可以查出来
wjmsino 2007-09-08
  • 打赏
  • 举报
回复
还有一题,请哪位高手解答,谢谢
wjmsino 2007-09-08
  • 打赏
  • 举报
回复
9 假设在 Oracle 数据库有以下 table A ,索引为Empno、Birthdate 请用实现以下要求,
工号 姓名 性别 下属员工工号 部门 出生日期 离职日期 工资
Empno Empname Sex Uempno Deptname Birthdate Offdate Salary
A : 建立Table,查询各部门的平均年龄
B : 查询各部门女性年龄最大者的人员数据
C : 查询员工资料,当”离职日期” 为空时,显示“在职”
当”离职日期”<当前日期时,显示“离职”
当”离职日期”>当前日期时,显示“即将离职”
D : 查询员工A的直接或间接下属的人员数据
oracle_my_love 2007-09-08
  • 打赏
  • 举报
回复
select avg(sno),sname,sum(decode(scurse,'数学',nsorce)) 数学,sum(decode(scurse,'语文',nsorce)) 语文,sum(decode(scurse,'英语',nsorce)) 英语 from student group by sname
hebo2005 2007-09-07
  • 打赏
  • 举报
回复
2
select y.学生编号,y.姓名,y.语文,s.数学,e.外语
from
(select a.学生编号,a.姓名,a.分数 语文 from table a where a.科别='语文') y,
(select a.学生编号,a.分数 数学 from table a where a.科别='数学') s,
(select a.学生编号,a.分数 外语 from table a where a.科别='外语') e
where y.学生编号=s.学生编号 and s.学生编号=e.学生编号
hebo2005 2007-09-07
  • 打赏
  • 举报
回复
b
select a.* from s_emp a,
(select dept_id,avg(salary) avg_salary from s_emp group by dept_id) b
where a.salary>b.avg_salary and a.dept_id=b.dept_id
hebo2005 2007-09-07
  • 打赏
  • 举报
回复
a
select * from (select * from s_emp order by salary desc) where rownum<4

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧