现有两个表一个是树形的机构表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语句,请各位大侠多多帮助-------
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语句,请各位大侠多多帮助-------
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
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