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

解决方案 »

  1.   

    a
    select * from (select * from s_emp order by salary desc) where rownum<4
      

  2.   

    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
      

  3.   

    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.学生编号
      

  4.   

    select avg(sno),sname,sum(decode(scurse,'数学',nsorce)) 数学,sum(decode(scurse,'语文',nsorce)) 语文,sum(decode(scurse,'英语',nsorce)) 英语 from student group by sname
      

  5.   

    9 假设在 Oracle  数据库有以下 table A ,索引为Empno、Birthdate 请用实现以下要求,
    工号 姓名 性别 下属员工工号 部门 出生日期 离职日期 工资
    Empno Empname Sex Uempno Deptname Birthdate Offdate Salary
    A : 建立Table,查询各部门的平均年龄
    B : 查询各部门女性年龄最大者的人员数据
    C : 查询员工资料,当”离职日期” 为空时,显示“在职”
                当”离职日期”<当前日期时,显示“离职”
                当”离职日期”>当前日期时,显示“即将离职”
    D : 查询员工A的直接或间接下属的人员数据
      

  6.   

    a
    select deptnmae,avg(trunc(to_number(sysdate-birthdate))/365)
    from a
    group by deptnameb
    select a.*
    from a,
    (select deptname ,min(birthdate) max
    from a
    group by deptname
    ) maxage
    where a.deptname=maxage.deptname
    and a.birhdate =maxage.maxc
    select Empno,empname,sex,Uempno,Deptname,Birthdate,
    decode(Offdate,null,'在职',decode(sign(sysdate-offdate),1,'离职',0,'离职',-1,'即将离职')) 在职情况, Salary
    from a
    其实你这个问题少了个离职日=于当前日的情况d
    你的表结构建错了吧,上下属就是父子结构,都是子结构对应父结构的,多个子对应一个父,你这里是倒过来,父结构对应子结构,意味着Uempno字段是多个下属编号组成的
    这里应该是上属的编号
      

  7.   

    关于D
    如果只有一直下属,你可这样建,如果有多个下属则肯定不行,需要建上属
    建上属的查下属查法
    select *
    from a
    start with Empno=领导编号
    connect by prior Empno = Uempno查上属查法
    select *
    from a
    start with Empno=员工编号
    connect by prior Uempno = Empno
      

  8.   

    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
      

  9.   

    1题
    a问:
    SELECT top 3 * FROM Document order by salary desc这样查询  如果前3名有并列的人  都可以查出来
      

  10.   

    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不过这句最好试验下
      

  11.   

    上面句,我试验了,还是写错了,应该这样写
    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))