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的值)。

解决方案 »

  1.   


    --你给的材料大致看懂了,给你举个例子
    select substr(DEPTCODE,1,5) DEPTCODE,
           sum(sum1)
      from table_name
     group by substr(DEPTCODE,1,5);--至于显示部门名称的话,和DEPTCODE关联一下就ok了。
      

  2.   

    问题是DEPTCODE有KD1011或KD1020的一级部门编码怎么办呢?
      

  3.   

    还有就是你的这个怎么判断哪些有二级哪些二级下还有三级,这些sum1的值累加到相应的上级中呢。
      

  4.   

    比如我一级部门有20个是从KD101至KD1020,你substr(DEPTCODE,1,5)只能保证前10个的可以这样分组,大后10个不是排除在外了。
      

  5.   

        DEPTCODE DEPTNAME SUM1 PK_FATHEDEPT PK_DEPTDOC
    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中。
      

  6.   

    1 如果你只需要一条SQL,并且编码是严格编制的,你可以通过截取的办法获取到一级部门,然后将其他的都累加。2 如果你的编码方式不能通过截取获得,那么写一个pl/sql的function,通过递归来计算。
      

  7.   

    --你给的材料大致看懂了,给你举个例子
    select substr(DEPTCODE,1,5) DEPTCODE,
           sum(sum1)
      from table_name
     group by substr(DEPTCODE,1,5);--至于显示部门名称的话,和DEPTCODE关联一下就ok了。
      

  8.   

    我要显示部门名称,我的想法就是直接max(table_name.部门名称)了,不知道这位兄弟说的要和DEPTCODE关联一下是什么意思,还请指教。谢谢!
      

  9.   

    这位兄弟说的“写一个pl/sql的function,通过递归来计算”,我没有接触过,能不能给我大概说下是怎么回事,或者这个在哪能够了解的到。
      

  10.   


    递归的意思是将上级部门的所有一级部门及其下所有二级部门的值累加起来 因为根据你的表结构,二级部门职能找到一级部门,在上级部门需要同过一级部门来找,这就需要使用递归此外如果截取出来的前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%'
      

  11.   

    “把二级、三级部门中的sum1数据累加到一级部门中”意思是三个部门的sum1数据累加还是只把二级和三级部门的sum1累加到一级部门作为一个列呢?
    如果是后者呢、、、把二级三级部门单找出来就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
    理解的不知道对不对呢
      

  12.   

    到目前为止,我现在就有二个问题了,大家就以我现在这个为准吧:
    一、前面BenChiM888(奔驰M888) 说的办法是可行的。我的DEPTCODE编码是前五位相同就是同个部门下的。用他说的办法是可以归属各部门的信息的。
    但现在新的问题是,用substr(DEPTCODE,1,5) DEPTCODE分组区分后,max(table_name.部门名称)。最后显示的结果sum1是对的,但部门名称不是一级部门的名称。有几个显示的部门名称是二级或者是三级的了。
    二、我想了解下前面二位兄弟所说的递归算法。我不知道实现这样的递归算法的前提条件是什么?
    按我前面所给的表结构能不能用递归算法去作?要如何去一级级的去把数据累计上去?
    谢谢!
      

  13.   

    到目前为止,我现在就有二个问题了,大家就以我现在这个为准吧:
    一、前面BenChiM888(奔驰M888) 说的办法是可行的。我的DEPTCODE编码是前五位相同就是同个部门下的。用他说的办法是可以归属各部门的信息的。
    但现在新的问题是,用substr(DEPTCODE,1,5) DEPTCODE分组区分后,max(table_name.部门名称)。最后显示的结果sum1是对的,但部门名称不是一级部门的名称。有几个显示的部门名称是二级或者是三级的了。
    二、我想了解下前面二位兄弟所说的递归算法。我不知道实现这样的递归算法的前提条件是什么?
    按我前面所给的表结构能不能用递归算法去作?要如何去一级级的去把数据累计上去?
    谢谢!
      

  14.   


    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;
      

  15.   

    。。!!!!!!!!!!
    DEPTCODE和部门名称都是一个表中的字段。结果还是部门名称不是一级部门的名称,有几个显示的部门名称是二级或者是三级的了。
      

  16.   

    select *
      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
      

  17.   

    给你举个例子吧。[SYS@orcl] SQL>with table1 as(
      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