SELECT ENAME,JOB,DEPTNO,SAL,CASE
  2  WHEN SAL IN (SELECT MAX(SAL) FROM EMP GROUP BY DEPTNO ) THEN '*'
  3  WHEN SAL IN (SELECT MIN(SAL) FROM EMP GROUP BY DEPTNO) THEN '-'
  4  END "MAX/MIN"
  5  FROM EMP ORDER BY SAL DESC;
 这段sql 是正确的 可是我就是不明白为什么?
 在 group by  后写deptno 是正确的,不是说查询时 必须有
列名为deptno 这一列才可以.

解决方案 »

  1.   

    不要搞反了,
    在group by后面的字段,在前面select出现,这个可以有
    在select中出现字段(非聚合函数参数的字段),在group by中,这个必须有
      

  2.   

    重在理解,不要死记,多练习SQL就知道了
      

  3.   


    SQL> select max(sal) from emp;
    --不分部门号,就是找出最高工资
      MAX(SAL)
    ----------
          5000SQL> select deptno,max(sal) from emp;select deptno,max(sal) from emp
    ORA-00937: not a single-group group function
    --看错误提示,因为检索字段多加了一个deptno,我们应该对deptno进行分组
    --为什么呢?因为不止一个部门,如果不对部门分组的话,
    --oracle不知道取出哪一个部门的最高工资
    SQL> select deptno,max(sal)
      2  from emp
      3  group by deptno;DEPTNO   MAX(SAL)
    ------ ----------
        10       5000
        20       3100
        30       2850
    --
    SQL> select deptno,min(sal) from emp
      2  group by deptno;DEPTNO   MIN(SAL)
    ------ ----------
        10       1300
        20        800
        30        950
    --
    SQL> select deptno,min(sal) from emp
      2  /select deptno,min(sal) from empORA-00937: not a single-group group function
      

  4.   

    如果select 中不包含聚合函数,这个可有可无group by
    如果select 中有有聚合函数字段,group by 是必须有的。
      

  5.   

    因为你用了MAX所以不用有这个字段也行。
    字段前用了min,sun,nvl,decode等都可以在个group by 中没有这个字段的