select max(deptdoc.deptcode) deptcode,
deptdoc.deptname deptname,
count(*) sum1,
max(deptdoc.pk_fathedept) pk_fathedept,
max(deptdoc.pk_deptdoc) pk_deptdoc
from bd_deptdoc deptdoc
left join bd_psndoc doc on doc.pk_deptdoc = deptdoc.pk_deptdoc
left join bd_psncl cl on cl.pk_psncl = doc.pk_psncl
where deptdoc.canceled='N' and deptdoc.hrcanceled='N' and doc.indocflag='Y' and cl.psnclasscode not in ('1002','20', '2001', '2002', '30', '3001','40') group by deptname
上面是我写的一个sql语句,主要是查询出所有部门中的人员信息
查询结果如下:
DEPTCODE DEPTNAME SUM1 PK_FATHEDEPT PK_DEPTDOC
1 KD101 董事长办公室 1 1001A11000000000000T
2 KD103 行政部 9 1001A110000000000015
3 KD104 人力资源部 5 1001A110000000000018
4 KD105 计财部 9 1001A11000000000001G
5 KD10501 五一加工厂财务 1 1001A11000000000001G 1001A11000000000002P
6 KD10502 北疆事业部财务 2 1001A11000000000001G 1001A11000000000003A
7 KD1050201 石河子分公司财务 1 1001A11000000000003A 1001A11000000000003G
8 KD1050202 伊犁分公司财务 1 1001A11000000000003A 1001A11000000000003P
9 KD1050203 南疆分公司财务 2 1001A11000000000003A 1001A110000000000044
10 KD10503 华北事业部财务 1 1001A11000000000001G 1001A11000000000004A
11 KD1050301 临河分公司财务 1 1001A11000000000004A 1001A11000000000004J
12 KD1050302 河南分公司财务 2 1001A11000000000004A 1001A11000000000004V
13 KD10504 东北事业部财务 1 1001A11000000000001G 1001A110000000000054
14 KD106 市场部 4 1001A11000000000001J
15 KD10601 北疆事业部 2 1001A11000000000001J 1001A110000000000037
16 KD1060101 石河子公司 2 1001A110000000000037 1001A11000000000003D
17 KD1060102 昌吉分公司 4 1001A110000000000037 1001A11000000000003J
18 KD1060103 伊犁分公司 7 1001A110000000000037 1001A11000000000003M
19 KD1060104 博乐分公司 2 1001A110000000000037 1001A11000000000003S
20 KD1060105 阿勒泰分公司 4 1001A110000000000037 1001A11000000000003V
21 KD1060106 额敏分公司 2 1001A110000000000037 1001A11000000000003Y
22 KD1060107 南疆分公司 5 1001A110000000000037 1001A110000000000041
因结果比较多,就粘过来前面几条。
数据字段间的关系说明如下:1、pk_deptdoc存的是下属部门的pk_fathedept值。比如:KD10601 北疆事业部pk_deptdoc的值是1001A110000000000037,对应的别的pk_fathedept值是1001A110000000000037的都属于它的下属部门。pk_fathedept值为null的说明是一级部门。
2、DEPTCODE的值前5位相同的也属于同一部门。如:KD105 计财部,KD10501 五一加工厂财务、KD10502 北疆事业部财务都属于计财部的二级部门。KD1050201石河子分公司财务属于北疆事业部的三级部门。
需求:1、把二级、三级部门中的sum1数据累加到一级部门中。2、只显示一级部门的信息(也就是说只显示pk_fathedept值为null的值)。
deptdoc.deptname deptname,
count(*) sum1,
max(deptdoc.pk_fathedept) pk_fathedept,
max(deptdoc.pk_deptdoc) pk_deptdoc
from bd_deptdoc deptdoc
left join bd_psndoc doc on doc.pk_deptdoc = deptdoc.pk_deptdoc
left join bd_psncl cl on cl.pk_psncl = doc.pk_psncl
where deptdoc.canceled='N' and deptdoc.hrcanceled='N' and doc.indocflag='Y' and cl.psnclasscode not in ('1002','20', '2001', '2002', '30', '3001','40') group by deptname
上面是我写的一个sql语句,主要是查询出所有部门中的人员信息
查询结果如下:
DEPTCODE DEPTNAME SUM1 PK_FATHEDEPT PK_DEPTDOC
1 KD101 董事长办公室 1 1001A11000000000000T
2 KD103 行政部 9 1001A110000000000015
3 KD104 人力资源部 5 1001A110000000000018
4 KD105 计财部 9 1001A11000000000001G
5 KD10501 五一加工厂财务 1 1001A11000000000001G 1001A11000000000002P
6 KD10502 北疆事业部财务 2 1001A11000000000001G 1001A11000000000003A
7 KD1050201 石河子分公司财务 1 1001A11000000000003A 1001A11000000000003G
8 KD1050202 伊犁分公司财务 1 1001A11000000000003A 1001A11000000000003P
9 KD1050203 南疆分公司财务 2 1001A11000000000003A 1001A110000000000044
10 KD10503 华北事业部财务 1 1001A11000000000001G 1001A11000000000004A
11 KD1050301 临河分公司财务 1 1001A11000000000004A 1001A11000000000004J
12 KD1050302 河南分公司财务 2 1001A11000000000004A 1001A11000000000004V
13 KD10504 东北事业部财务 1 1001A11000000000001G 1001A110000000000054
14 KD106 市场部 4 1001A11000000000001J
15 KD10601 北疆事业部 2 1001A11000000000001J 1001A110000000000037
16 KD1060101 石河子公司 2 1001A110000000000037 1001A11000000000003D
17 KD1060102 昌吉分公司 4 1001A110000000000037 1001A11000000000003J
18 KD1060103 伊犁分公司 7 1001A110000000000037 1001A11000000000003M
19 KD1060104 博乐分公司 2 1001A110000000000037 1001A11000000000003S
20 KD1060105 阿勒泰分公司 4 1001A110000000000037 1001A11000000000003V
21 KD1060106 额敏分公司 2 1001A110000000000037 1001A11000000000003Y
22 KD1060107 南疆分公司 5 1001A110000000000037 1001A110000000000041
因结果比较多,就粘过来前面几条。
数据字段间的关系说明如下:1、pk_deptdoc存的是下属部门的pk_fathedept值。比如:KD10601 北疆事业部pk_deptdoc的值是1001A110000000000037,对应的别的pk_fathedept值是1001A110000000000037的都属于它的下属部门。pk_fathedept值为null的说明是一级部门。
2、DEPTCODE的值前5位相同的也属于同一部门。如:KD105 计财部,KD10501 五一加工厂财务、KD10502 北疆事业部财务都属于计财部的二级部门。KD1050201石河子分公司财务属于北疆事业部的三级部门。
需求:1、把二级、三级部门中的sum1数据累加到一级部门中。2、只显示一级部门的信息(也就是说只显示pk_fathedept值为null的值)。
--你给的材料大致看懂了,给你举个例子
select substr(DEPTCODE,1,5) DEPTCODE,
sum(sum1)
from table_name
group by substr(DEPTCODE,1,5);--至于显示部门名称的话,和DEPTCODE关联一下就ok了。
1 KD101 董事长办公室 1 1001A11000000000000T
2 KD103 行政部 9 1001A110000000000015
3 KD104 人力资源部 5 1001A110000000000018
4 KD105 计财部 9 1001A11000000000001G
14 KD106 市场部 4 1001A11000000000001J
31 KD107 生产部 10 1001A11000000000001M
34 KD108 研究中心 23 1001A11000000000001P
35 KD109 国际业务部 3 1001A11000000000001S
36 KD110 审计部 2 1001A11000000000001V
37 KD111 品管部 8 1001A11000000000001Y
38 KD113 产品部 3 1001A110000000000024
39 KD114 董秘办 3 1001A110000000000027
40 KD115 项目部 3 1001A11000000000002A
41 KD116 法务部 2 1001A11000000000002D
42 KD118 加工部 2 1001A11000000000002J
47 KD119 北京子公司 3 1001A11000000000005M想要的就是这样的显示结果,并且他们各子部门的sum1的值要合计到此显示sum1中。
select substr(DEPTCODE,1,5) DEPTCODE,
sum(sum1)
from table_name
group by substr(DEPTCODE,1,5);--至于显示部门名称的话,和DEPTCODE关联一下就ok了。
递归的意思是将上级部门的所有一级部门及其下所有二级部门的值累加起来 因为根据你的表结构,二级部门职能找到一级部门,在上级部门需要同过一级部门来找,这就需要使用递归此外如果截取出来的前5位或6位代码已经可以代表一个上级部门,就可以
直接用sql 类似
select sum(sum1) from table where dep_code like 'KD10601%'
select sum(sum1) from table where dep_code like 'KD10602%'
....
select sum(sum1) from table where dep_code like 'KD106020%'
如果是后者呢、、、把二级三级部门单找出来就OK了
select DEPTNAME,sum(sum1) sum2 from (select * from (select t.*,length(DEPTCODE) length from tab t) f where length<>5) a group by DEPTNAME
理解的不知道对不对呢
一、前面BenChiM888(奔驰M888) 说的办法是可行的。我的DEPTCODE编码是前五位相同就是同个部门下的。用他说的办法是可以归属各部门的信息的。
但现在新的问题是,用substr(DEPTCODE,1,5) DEPTCODE分组区分后,max(table_name.部门名称)。最后显示的结果sum1是对的,但部门名称不是一级部门的名称。有几个显示的部门名称是二级或者是三级的了。
二、我想了解下前面二位兄弟所说的递归算法。我不知道实现这样的递归算法的前提条件是什么?
按我前面所给的表结构能不能用递归算法去作?要如何去一级级的去把数据累计上去?
谢谢!
一、前面BenChiM888(奔驰M888) 说的办法是可行的。我的DEPTCODE编码是前五位相同就是同个部门下的。用他说的办法是可以归属各部门的信息的。
但现在新的问题是,用substr(DEPTCODE,1,5) DEPTCODE分组区分后,max(table_name.部门名称)。最后显示的结果sum1是对的,但部门名称不是一级部门的名称。有几个显示的部门名称是二级或者是三级的了。
二、我想了解下前面二位兄弟所说的递归算法。我不知道实现这样的递归算法的前提条件是什么?
按我前面所给的表结构能不能用递归算法去作?要如何去一级级的去把数据累计上去?
谢谢!
SELECT T1.DEPTCODE, T2.部门名称, T1.SUM_TOTAL
FROM (SELECT SUBSTR(DEPTCODE, 1, 5) DEPTCODE, SUM(SUM1) SUM_TOTAL
FROM TABLE_NAME
GROUP BY SUBSTR(DEPTCODE, 1, 5)) T1,
T2 --t2就是你的含有部门名称的表
WHERE T1.DEPTCODE = T2.DEPTCODE;
DEPTCODE和部门名称都是一个表中的字段。结果还是部门名称不是一级部门的名称,有几个显示的部门名称是二级或者是三级的了。
from (SELECT DEPTCODE,
DEPT_NAME,
SUM(SUM1) over(partition by SUBSTR(DEPTCODE, 1, 5))
FROM TABLE_NAME) as sum1,
PK_FATHEDEPT,
PK_DEPTDOC
where PK_FATHEDEPT is null
order by DEPTCODE
2 select 'KD101' DEPTCODE,'董事长办公室' DEPTNAME, 1 SUM1 from dual union all
3 select 'KD103' ,'行政部' DEPTNAME, 9 SUM1 from dual union all
4 select 'KD104','人力资源部' DEPTNAME, 5 SUM1 from dual union all
5 select 'KD105','计财部' DEPTNAME, 9 SUM1 from dual union all
6 select 'KD10501' ,'五一加工厂财务' DEPTNAME, 1 SUM1 from dual union all
7 select 'KD10502','北疆事业部财务' DEPTNAME, 2 SUM1 from dual union all
8 select 'KD1050201' ,'石河子分公司财务' DEPTNAME, 1 SUM1 from dual union all
9 select 'KD1050202' ,'伊犁分公司财务' DEPTNAME, 1 SUM1 from dual union all
10 select 'KD1050203' ,'南疆分公司财务' DEPTNAME, 2 SUM1 from dual union all
11 select 'KD10503' ,'华北事业部财务' DEPTNAME, 1 SUM1 from dual union all
12 select 'KD1050301' ,'临河分公司财务' DEPTNAME, 1 SUM1 from dual union all
13 select 'KD1050302' ,'河南分公司财务' DEPTNAME, 2 SUM1 from dual union all
14 select 'KD10504' ,'东北事业部财务' DEPTNAME, 1 SUM1 from dual union all
15 select 'KD106' ,'市场部' DEPTNAME, 4 SUM1 from dual union all
16 select 'KD10601' ,'北疆事业部' DEPTNAME, 2 SUM1 from dual union all
17 select 'KD1060101' ,'石河子公司' DEPTNAME, 2 SUM1 from dual union all
18 select 'KD1060102' ,'昌吉分公司' DEPTNAME, 4 SUM1 from dual union all
19 select 'KD1060103' ,'伊犁分公司' DEPTNAME, 7 SUM1 from dual union all
20 select 'KD1060104' ,'博乐分公司' DEPTNAME, 2 SUM1 from dual union all
21 select 'KD1060105' ,'阿勒泰分公司' DEPTNAME, 4 SUM1 from dual union all
22 select 'KD1060106' ,'额敏分公司' DEPTNAME, 2 SUM1 from dual union all
23 select 'KD1060107' ,'南疆分公司' DEPTNAME, 5 SUM1 from dual
24 )SELECT T1.DEPTCODE, T2.DEPTNAME, T1.SUM_TOTAL
25 FROM (SELECT SUBSTR(DEPTCODE, 1, 5) DEPTCODE, SUM(SUM1) AS SUM_TOTAL
26 FROM TABLE1
27 GROUP BY SUBSTR(DEPTCODE, 1, 5)) T1,
28 TABLE1 T2
29 WHERE T1.DEPTCODE = T2.DEPTCODE;DEPTCODE DEPTNAME SUM_TOTAL
---------- ---------------- ----------
KD101 董事长办公室 1
KD103 行政部 9
KD104 人力资源部 5
KD105 计财部 21
KD106 市场部 32