with test as(
select 'gao' 姓名,2 年龄,100 工资,'a' 部门 from dual union all
select 'hui' 姓名,8 年龄,200 工资,'a' 部门 from dual union all
select 'rong' 姓名,11 年龄,300 工资,'b' 部门 from dual union all
select 'liu' 姓名,14 年龄,500 工资,'b' 部门 from dual union all
select 'jin' 姓名,16 年龄,700 工资,'b' 部门 from dual union all
select 'feng' 姓名,20 年龄,800 工资,'b' 部门 from dual union all
select 'aa' 姓名,3 年龄,200 工资,'b' 部门 from dual union all
select 'bb' 姓名,6 年龄,900 工资,'a' 部门 from dual ),
rules as(
select 1 起始值,7 终止值,'inf' 定义别名,'p' 规则区分 from dual union all
select 8 起始值,13 终止值,'chd' 定义别名,'p' 规则区分 from dual union all
select 14 起始值,20 终止值,'man' 定义别名,'p' 规则区分 from dual union all
select 100 起始值,200 终止值,'low' 定义别名,'s' 规则区分 from dual union all
select 300 起始值,600 终止值,'mid' 定义别名,'s' 规则区分 from dual union all
select 700 起始值,1000 终止值,'hig' 定义别名,'s' 规则区分 from dual)
select 部门, p, s, count(1) 人数
  from (select 姓名,
               (select 定义别名
                  from rules
                 where 规则区分 = 'p'
                   and test.年龄 between 起始值 and 终止值) p,
               (select 定义别名
                  from rules
                 where 规则区分 = 's'
                   and test.工资 between 起始值 and 终止值) s,
               部门
          from test)
 group by 部门, p, s
 order by 部门
[code=sq]
序号     部门         p                 s             人数
1 a chd low 1
2 a inf hig 1
3 a inf low 1
4 b chd mid 1
5 b inf low 1
6 b man hig 2
7 b man mid 1[/code]
不知道是不是这个意思,你的人数是按照[部门,s,p]分组统计出来的吧。。

解决方案 »

  1.   

    with test as(
    select 'gao' 姓名,2 年龄,100 工资,'a' 部门 from dual union all
    select 'hui' 姓名,8 年龄,200 工资,'a' 部门 from dual union all
    select 'rong' 姓名,11 年龄,300 工资,'b' 部门 from dual union all
    select 'liu' 姓名,14 年龄,500 工资,'b' 部门 from dual union all
    select 'jin' 姓名,16 年龄,700 工资,'b' 部门 from dual union all
    select 'feng' 姓名,20 年龄,800 工资,'b' 部门 from dual union all
    select 'aa' 姓名,3 年龄,200 工资,'b' 部门 from dual union all
    select 'bb' 姓名,6 年龄,900 工资,'a' 部门 from dual ),
    rules as(
    select 1 起始值,7 终止值,'inf' 定义别名,'p' 规则区分 from dual union all
    select 8 起始值,13 终止值,'chd' 定义别名,'p' 规则区分 from dual union all
    select 14 起始值,20 终止值,'man' 定义别名,'p' 规则区分 from dual union all
    select 100 起始值,200 终止值,'low' 定义别名,'s' 规则区分 from dual union all
    select 300 起始值,600 终止值,'mid' 定义别名,'s' 规则区分 from dual union all
    select 700 起始值,1000 终止值,'hig' 定义别名,'s' 规则区分 from dual)
    select 部门, p, s, count(1) 人数
      from (select 姓名,
                   (select 定义别名
                      from rules
                     where 规则区分 = 'p'
                       and test.年龄 between 起始值 and 终止值) p,
                   (select 定义别名
                      from rules
                     where 规则区分 = 's'
                       and test.工资 between 起始值 and 终止值) s,
                   部门
              from test)
     group by 部门, p, s
     order by 部门
    [code=sq]
    序号     部门         p                 s             人数
    1 a chd low 1
    2 a inf hig 1
    3 a inf low 1
    4 b chd mid 1
    5 b inf low 1
    6 b man hig 2
    7 b man mid 1[/code]
    不知道是不是这个意思,你的人数是按照[部门,s,p]分组统计出来的吧。。谢谢大神,很有用