以SCOTT用户的dept表和emp表为例1、创建一个查询,按照工作进行分组,求出各组内分别在10、20、30部门工作的雇员的工资的总数,以及各组的工资的合计。
设置恰当的列标题。select
2、创建一个查询显示所有雇员的数量以及分别在1981、1982、1983年加入公司的雇员的数量。
3、编写一个查询显示雇员的最高工资和最低工资的差距。
4、编写一个查询显示各个部门员工的平均工资。
5、编写一个查询显示各个部门中超过该部门平均工资的员工的信息。
6、编写一个查询显示非销售人员工作名称以及从事同一工作雇员的月工资总和。
7、计算销售部门的人员工资总和、工资的最大值、最小值、和平均值。
8、统计各个部门人数占雇员总数的百分比。     部门编号   部门名称   部门人数    百分比(%)       10        sales      4           4select e.deptno as "部门编号",
count(*) as "部门人数",
(round((count(*)/(tmntp.c)*100,2))||'%' as "部门人数百分比")from emp e,(select count(*) cnt from  emp) tmp
group by e.deptno,tmp.cnt
order by e.deptno asc;
9、查询谁是第5个进入公司的雇员,查询其详细信息?
10、查询列出入职日期前五名雇员。
呵呵,帮个忙

解决方案 »

  1.   

    --1
    SELECT decode(grouping_id(t.job), 1, '合计', t.job) job,
           decode(grouping_id(t.deptno), 1, '小计', t.deptno) deptno,
           SUM(t.sal) sumsal
      FROM emp t
     WHERE t.deptno IN (10, 20, 30)
     GROUP BY ROLLUP(t.job, t.deptno);
    --2
    SELECT to_char(t.hiredate, 'yyyy') YEAR, COUNT(*) cnt
      FROM emp t
     WHERE to_char(t.hiredate, 'yyyy') IN ('1981', '1982', '1983')
     GROUP BY ROLLUP(to_char(t.hiredate, 'yyyy'));
    --3
    SELECT MAX(t.sal) - MIN(t.sal) FROM emp t;
    --4
    SELECT t.deptno, AVG(sal) avgsal FROM emp t GROUP BY t.deptno;
    --5
    SELECT *
      FROM emp t
     WHERE t.sal > (SELECT AVG(sal) FROM emp a WHERE a.deptno = t.deptno);
    --6
    SELECT t.job, SUM(t.sal) sumsal
      FROM emp t
     WHERE t.job <> 'SALESMAN'
     GROUP BY t.job;
    --7
    SELECT SUM(t.sal) sumsal,
           MAX(t.sal) maxsal,
           MIN(t.sal) minsal,
           AVG(t.sal) avgsal
      FROM emp t
     WHERE t.job = 'SALESMAN';
    --8
    SELECT a.deptno, a.dname, c.cnt, c.cnt / total * 100
      FROM dept a,
           (SELECT b.deptno, COUNT(*) cnt, (SELECT COUNT(*) FROM emp) total
              FROM emp b
             GROUP BY b.deptno) c
     WHERE a.deptno = c.deptno;
    --9
    SELECT *
      FROM (SELECT rownum rn, a.*
              FROM (SELECT t.* FROM emp t ORDER BY t.hiredate) a)
     WHERE rn = 5;
    --10
    SELECT *
      FROM (SELECT rownum rn, a.*
              FROM (SELECT t.* FROM emp t ORDER BY t.hiredate) a)
     WHERE rn <= 5;
      

  2.   

    唐人  人家拿你练习sql了 呵呵
      

  3.   

    要开会了,先给你第一个问题的答案
    1.select * from (select e.* ,sum(e.sal) over(partition by job,deptno ) 组内各个部门工作的雇员工资总数,
                                 sum(e.sal) over(partition by job) 各组的工资的合计
                                     from emp e ) ;
      

  4.   

    我觉得第一题应该是这样的吧
    SELECT job,
      SUM(DECODE(deptno,10,sal))"10",
      SUM(DECODE(deptno,20,sal))"20",
      SUM(DECODE(deptno,30,sal))"30",
      SUM(sal)total
    FROM SCOTT.emp
    GROUP BY job