我有一个数据表(EMP),   结构如下 ORG表 组织表
ORG_ID(组织的ID,相当于主键),   ORG_NM(组织名字),  PARENT_ORG_ID(父组织ID),ORG_LEVEL(组织层数)ORG_BELNG (员工--组织表)
ORG_ID(组织的ID),EMP_ID(员工ID) EMP 员工表
 EMP_CLS(员工分类),EMP_ID(员工ID) 
一个组织有下属组织,下属组织也有下属组织, ORG_LEVEL(组织层数)代表组织是在第几层, 最高层为0, 第一层(最高层的下一层)ORG_LEVEL为1
一个组织有N个员工,员工有两种不能状态,   用EMP_CLS   表示 
EMP_CLS有两种状态,   用1,   2,    数字表示,   我想用SQL语句显示为下面的效果: ORG_NM ¦ 人数(这个组织共有多少人数,EMP_CLS=1时)EMP_ACCOUNT1¦(EMP_CLS=2时)MP_ACCOUNT2
            
       ¦ 
       | ¦                                                                                                  ¦                                                     ¦                         ¦ 
        |    ¦                                                                                                 ¦                                                     ¦                         ¦ 
        ¦        |                                                                                         ¦       |                                              ¦                         ¦ 
        ¦        |                                                                                           ¦       |                                              ¦                         ¦ EMP_ACCOUNT1   EMP_ACCOUNT2   EMP_ACCOUNT3   分别是员工状态为EMP_CLS=1,EMP_CLS=2,EMP_CLS3的员工共有多少人 
既显示的表有三例,如下
ORG_NM ¦
EMP_ACCOUNT1¦ 人数(这个组织共有多少人数,EMP_CLS=1时)
MP_ACCOUNT2人数(这个组织共有多少人数,EMP_CLS=2时)现在想用SQL语句查出如上显示的表, 但EMP_ACCOUNT1要包括所有的下属组织
大家帮我考虑一下, 用SQL语句能够实现吗, 
给我想个算法也可以   ,有不明白的地方可以问我啊

解决方案 »

  1.   

    EMP_ACCOUNT1要包括所有的下属组织 的人数, 包括本组织的人数
      

  2.   

    ORG_ID,       ORG_NM,     PARENT_ORG_ID, ORG_LEVEL 
     0            资源下载中心   0                   0
     1            免费体验1       0                  1
     2            免费体验2       1                  2
     3            优惠首选时代     0                  1
    ORG_BELNG 表
    ORG_ID,EMP_ID
     0       11111
     0       11112
     1       11113
     1       11116 
     2       11114
     2       11115 
    EMP   员工表 
      EMP_CLS(员工分类),EMP_ID(员工ID
         1             11111
         2             11112
         1             11113
         1             11114
         2             11115
         3             11116     求    ORG_LEVEL =1 下的EMP_CLS=1的员工有多少个, EMP_CLS=2的员工有多少个, 因为ORG_LEVEL =1有下属组织, 所以计算人数时,也要把他的下属组织人数也要计算在内      
      

  3.   

    mantisXF 又是你帮我哦,  这次快帮一下我啊, 
      

  4.   

    首先把下面2张表当成1张表select o.ORG_ID,e.* from ORG_BELNG o,EMP  e
    where o.EMP_ID = e.EMP_ID 求机构下的人员用select ORG_ID from tabke start with ORG_ID=1 connect by PARENT_ORG_ID=prior.ORG_LEVEL    (没查,可能有点错误)2个sql和起来就差不多,手边没有oracle,不能测试
      

  5.   

    我觉得你的表没设计好,至少不满足第三范士,PARENT_ORG_ID(父组织ID) 没有完全依赖ORG_ID,再说ORG表   组织表 把所有的组织都包含近来,没必要吧。 一个部门的业务不可能一样吧? 我是这样想的。在加个表 把同一类型的组织放到里面去会很容易些。
      

  6.   

    try it ...select ob.org_id,
           sum(case when em.EMP_CLS = 1
                    then 1
                    else 0
                end) as EMP_ACCOUNT1,
           sum(case when em.EMP_CLS = 2
                    then 1
                    else 0
                end) as EMP_ACCOUNT2
      from EMP em,
           ORG_BELNG ob
     where em.EMP_ID = ob.EMP_ID
       and ob.org_id in (
               select distinct
                   tt.ORG_ID
                 from ORG tt
                 start with tt.ORG_LEVEL = 1
               connect by prior tt.ORG_LEVEL = tt.PARENT_ORG_ID
              )
     group by ob.org_id;
      

  7.   

    再次谢谢mantisXF 
    但mantisXF 的语句还是没满足我的要求, select distinct
                   tt.ORG_ID
                 from ORG tt
                 start with tt.ORG_LEVEL = 1
               connect by prior tt.ORG_LEVEL = tt.PARENT_ORG_ID
    会把下属组织的ORG_ID都查出来了, 
    我要的org_id只是第一层的, 
    而且计算的人数不是包括下属组织的,我这里没有ORACLE,  不知道有没有分析错了, 
      

  8.   

    听别人说这条SQL可能会写上1000行, 
     我不知道是否要写这么多行,才能达到目的
      

  9.   

    哎~~ 总觉得LZ的XY真强,竟然还没满足你的要求 ...  哈哈引用:
    求 ORG_LEVEL   =1 下的EMP_CLS=1的员工有多少个,EMP_CLS=2的员工有多少个,因为ORG_LEVEL=1有下属组织,所以计算人数时,也要把他的下属组织人数也要计算在内.这可是你说的要计算人数时,也要把他的下属组织人数也要计算在内的.
    如果只是计算org_id只是第一层的话,那就试试看下面的sql:
    select ob.org_id,
           sum(case when em.EMP_CLS = 1
                    then 1
                    else 0
                end) as EMP_ACCOUNT1,
           sum(case when em.EMP_CLS = 2
                    then 1
                    else 0
                end) as EMP_ACCOUNT2
      from EMP em,
           ORG_BELNG ob,
           ORG o
     where em.EMP_ID = ob.EMP_ID
       and ob.ORG_ID = o.ORG_ID
       and o.ORG_LEVEL = 1
     group by ob.org_id;
      

  10.   

    org_id是第一层, 但也要把第一层的下属组织的人数计算在内啊,
      

  11.   

    XD,我好像明白你的意思了,可能用一个sql不是那么容易搞定的,明天我再看看还有什么其他的办法没 ...