比如说这条语句:
select 单位名称,count(职工.id),sum(职工工资) from [表名]
group by 单位名称
我知道group by 的意思是分组,但我不是很明白,这个分组起到什么作用,还有从以上语句中  分组为什么只分  单位名称 这个字段. 
  初级选手,求解,非常感谢,这个问题挺困扰我的,可能是一时没开窍,求详解.太谢谢了!!!

解决方案 »

  1.   

    那如果有一个需求是,要求出每个单位有多少职工,并且,每个单位职工工职的总额。怎么来完成?
    那只能根据单位来分组。如果 select sum(工资) group by 单位名称,职工;
    则是求所有单位每个职工的工资,显然没有意义,这跟未分组没区别。理解的办法是创建一张表,录入测试数据。
    按照你想法输入不同SQL,再将预期结果与实际结果对比。
      

  2.   

    select 单位名称,count(职工.id),sum(职工工资) from [表名]
    group by 单位名称这个就需要点oracle基础了,count()和sum()都是聚簇函数,select结果集的时候,且select中有用到聚簇函数,要把非聚簇函数之外的字段放到group by 的后边。分组的意思就是将对一个组别的员工的工资进行加总求和 
      

  3.   


    --统计每个部门的员工数量和总工资
    SQL> select d.deptno,count(e.empno),sum(e.sal)
      2  from dept d,emp e
      3  where d.deptno=e.deptno
      4  /
     
    select d.deptno,count(e.empno),sum(e.sal)
    from dept d,emp e
    where d.deptno=e.deptno
    --如果不按照部门号分组,将会报错 
    ORA-00937: not a single-group group function
    --且看错误提示:非单分组函数
    --也就是在统计员工数量和总工资的时候,oracle不知道怎么统计
    --如果将所有员工数量和所有员工工资和作为最后结果,那么这是错误的做法,
    --否则怎么样统计呢?oracle不得而知......
    --如果将deptno去掉,我们得到了一个没有任何意义的答案
    SQL> 
    SQL> select d.deptno,count(e.empno),sum(e.sal)
      2  from dept d,emp e
      3  where d.deptno=e.deptno
      4  group by d.deptno
      5  /
     
    DEPTNO COUNT(E.EMPNO) SUM(E.SAL)
    ------ -------------- ----------
        10              3       8750
        20              5      10975
        30              6       9400
    --按照deptno分组统计,我们才得到正确的答案 
    SQL> --在看下面一个实例
    --找出每个部门中最高工资和最低工资
    SQL> select deptno,max(sal),min(sal)
      2  from emp
      3  /
     
    select deptno,max(sal),min(sal)
    from emp
    --如果不分组,会报错,
    --我们是统计个部门,而不是整个员工表中的最高工资,和最低工资 
    ORA-00937: not a single-group group function
     
    SQL> 
    SQL> select deptno,max(sal),min(sal)
      2  from emp
      3  group by deptno
      4  /
     
    DEPTNO   MAX(SAL)   MIN(SAL)
    ------ ---------- ----------
        10       5000       1300
        20       3100        800
        30       2850        950
      

  4.   

    因为你是对单位名称进行group by  ,所以你前面只能有单位名称不用函数,其他都要进行统计
      

  5.   

    http://hi.baidu.com/784633420/blog/item/f7b4355524ab02133a2935eb.html
    在select 语句中可以使用group by 子句将行划分成较小的组,然后,使用聚组函数返回每一个组的汇总信息,另外,可以使用having子句 限制返回的结果集。group by 子句可以将查询结果分组,并返回行的汇总信息Oracle 按照group by 子句中指定的表达式的值分组查询 结果。 
    在带有group by 子句的查询语句中,在select 列表中指定的列要么是group by 子句中指定的列,要么包含聚组函数 
    select max(sal),job emp group by job; 
    (注意max(sal),job的job并非一定要出现,但有意义) 
    查询语句的select 和group by ,having 子句是聚组函数唯一出现的地方,在where 子句中不能使用聚组函数。 
    select deptno,sum(sal) from emp where sal>1200 group by deptno having sum(sal)>8500 order by deptno; 
    当在gropu by 子句中使用having 子句时,查询结果中只返回满足having条件的组。在一个sql语句中可以有where子句和having子句。having 与where 子句类似,均用于设置限定条件 
    where 子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,条件中不能包含聚组函数,使用where条件显示特定的行。 
    having 子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having 条件显示特定的组,也可以使用多个分组标准进行分组。 
    查询每个部门的每种职位的雇员数 
    select deptno,job,count(*) from emp group by deptno,job