现有两个表一个是树形的机构表tbOrg:
id,orgname,parentid,其中parentid 指定其上级机构代码形成有层次的机构树,顶级机构的parentid为-1
另一个表为人员组成tbEmployee:
id,userName,orgId,Age,Edu,Gender--orgid与tborg中id关联指定其所属机构,
现要按二级机构统计出人员的性别组成,年龄构成(按30,40分段)
如:
tborg有如下数据:
id   orgname    parentid
0     董事局      -1
1     人力资源部   0
2     技术部       0
3     销售部       0
4     协调组       1
5     档案组       1
6     项目组        2
7    net组          6
8   java组            6tbEmployee表有数据
id      userName   Age   gender   Edu    orgId
0         张三      45     男     研究生   1
1       李四      30     女     本科      2
2        马六        22    男      大专     6
3        王五      45     男     研究生   1
4       陈其      30     女     本科      3
5        路试        22    男      大专     6按一级部门(人力资源部、技术部、销售部)统计出人员组成如下部门            年  龄  组   成
               -------------------------
                 30岁一下   30-40  40以上
人力资源部         0        0         2
技术部             2        1         0
销售部             0        1         0求SQl语句,请各位大侠多多帮助-------  

解决方案 »

  1.   

    select orgname ,
             sum(case when age <= 30 then 1 else 0 end),
             sum(case when age > 30 and age <=40 then 1 else 0 end),
             sum(case when age >40  then 1 else 0 end),
    (select id from tbOrg where  parentid  = -1 ) a,  -- 顶级机构的parentid为-1
    tbOrg  b,
    tbEmployee c
    where a.id = b.parentid   -- 父机构为顶级机构的是不是就是二级机构??
    and orgId = b.id 
    group by orgname 
      

  2.   

    给你一个间接的解决方法
    SQL> select * from tborg;
     
            ID ORGNAME                PARENTID
    ---------- -------------------- ----------
             0 董事局                       -1
             1 人力资源部                    0
             2 技术部                        0
             3 销售部                        0
             4 协调组                        1
             5 档案组                        1
             6 项目组                        2
             7 net组                         6
             8 java组                        6
     
    9 rows selected
     
    SQL> select * from tbemployee;
     
            ID USERNAME                    AGE GENDER               EDU                       ORGID
    ---------- -------------------- ---------- -------------------- -------------------- ----------
             0 张三                         45 男                   研究生                        1
             1 李四                         30 女                   本科                          2
             2 马六                         22 男                   大专                          6
             3 王五                         45 男                   研究生                        1
             4 陈其                         30 女                   本科                          3
             5 路试                         22 男                   大专                          6
     
    6 rows selectedSQL> create table tborg_tmp as select tborg.*,0 "30以下",0 "30到40",0 "40以上" from tborg;Table createdSQL> select * from tborg_tmp;
     
            ID ORGNAME                PARENTID       30以下      30到40       40以上
    ---------- -------------------- ---------- ---------- ---------- ----------
             0 董事局                       -1          0          0          0
             1 人力资源部                    0          0          0          0
             2 技术部                        0          0          0          0
             3 销售部                        0          0          0          0
             4 协调组                        1          0          0          0
             5 档案组                        1          0          0          0
             6 项目组                        2          0          0          0
             7 net组                         6          0          0          0
             8 java组                        6          0          0          0
     
    9 rows selected
    SQL> update tborg_tmp tmp
      2  set ("30以下","30到40","40以上") =
      3  (
      4  select "30以下","30到40","40以上" from
      5  (
      6  select orgid,
      7  sum(case when age < 30 then 1 else 0 end) as "30以下",
      8  sum(case when age >= 30 and age <= 40 then 1 else 0 end) as "30到40",
      9  sum(case when age > 40 then 1 else 0 end) as "40以上"
     10  from tbemployee
     11  group by orgid
     12  ) a
     13  where a.orgid = tmp.id
     14  )
     15  ;
     
    9 rows updated
     
    SQL> select * from tborg_tmp;
     
            ID ORGNAME                PARENTID       30以下      30到40       40以上
    ---------- -------------------- ---------- ---------- ---------- ----------
             0 董事局                       -1                       
             1 人力资源部                    0          0          0          2
             2 技术部                        0          0          1          0
             3 销售部                        0          0          1          0
             4 协调组                        1                       
             5 档案组                        1                       
             6 项目组                        2          2          0          0
             7 net组                         6                       
             8 java组                        6                       
     
    9 rows selectedSQL> create table tborg_result as select tborg.*,0 "30以下",0 "30到40",0 "40以上" from tborg;Table createdSQL> update tborg_result result
      2  set ("30以下","30到40","40以上") =
      3  (
      4  select
      5  sum("30以下") as "30以下",
      6  sum("30到40") as "30到40",
      7  sum("40以上") as "40以上"
      8  from tborg_tmp
      9  start with id = result.id
     10  connect by prior id = parentid
     11  )
     12  ;
     
    9 rows updated
     
    SQL> select * from tborg_result;
     
            ID ORGNAME                PARENTID       30以下      30到40       40以上
    ---------- -------------------- ---------- ---------- ---------- ----------
             0 董事局                       -1          2          2          2
             1 人力资源部                    0          0          0          2
             2 技术部                        0          2          1          0
             3 销售部                        0          0          1          0
             4 协调组                        1                       
             5 档案组                        1                       
             6 项目组                        2          2          0          0
             7 net组                         6                       
             8 java组                        6                       
     
    9 rows selected