最近在看《Oracle 11g数据库管理员指南》这本书,发现书中有个错误。
示例:假设要求按照部门号对员工的工资进行统计,参加统计的员工工资必须大于1000 元,将统计结果中凡满足最低工资在900元以上,并且工资总和在7000元以上的部门统计信息显示出来,显示时按照工资总和从大到小排序,如果工资总和相同,再按照部门号从小到大排序。
书中给出的语句是:select deptno as 部门号,avg(sal) as 平均工资,min(sal) as 最低工资,max(sal) as 最高工资,sum(sal) as 工资总和 from emp where sal>1000 group by deptno having min(sal)>900 and sum(sal)>7000 order by max(sal) desc,deptno asc;
疑问:在where子句中已将员工工资低于1000元的数据剔除,不参与统计。所以输出的数据中的sal全部是大于1000元的,结果,在having子句中,部门最低工资在900元以上的条件其实是多余的,没有达到示例中要求的目的。请大神给出正确的语句。

解决方案 »

  1.   

    根据问题描述, 某人工资有多份 如果有一份工资大于1000就可以查询出此人。 但是他还有一份最小的工资,所以在having 中再次进行了过滤,将最少一份工资低于900的人过滤掉。
      

  2.   

    示例要求的是这样没错,但从语句执行情况来看,是达不到示例所要求的那样。因为在where子句中,已将所有工资低于1000元的员工剔除统计,所以在having子句中,所有部门的最低工资都是不低于1000元的。我现在就是想知道,如果要达到示例所要求的目的,SQL语句应该怎么写。我上述的示例引用的表是oracle 11g中SCOTT用户里自带的example表。
      

  3.   

    select deptno as 部门号,avg(sal) as 平均工资,min(sal) as 最低工资,max(sal) as 最高工资,sum(sal) as 工资总和 
    from emp where sal>1000 and 
         deptno in(select deptno from emp group by deptno having  min(sal)>900 and sum(sal)>7000) 
    group by deptno 
    order by max(sal) desc,deptno asc;