想创建一个综合查询的视图,遇到一个棘手的问题。
有三个表,Employee(员工信息)  EmpUnit(员工组织单元关系表)  Unit(组织单元表)表的详细定义(由于列比较多所以只列出一些关键字段)表Employee
EmployeeId 
表EmpUnit (一个员工对应一个直接组织单元另外还对应多个上级组织单元,也就是一对多的关系)
EmployeeId
UnitId
表Unit
UnitId
UnitLevel(标识这个组织单元的级别)问题:
想创建一个视图如下
 
员工Id | 一级组织单元Id | 二级组织单元Id | 三级组织单元Id请问这样的Sql因该如何制作,谢谢啦~
 

解决方案 »

  1.   

    CREATE VIEW V_EPMUNIT AS 
    SELECT EmpUnit.EmployeeId,
    CASE WHEN Unit.UnitLevel = 1 THEN Unit.UnitId END,
    CASE WHEN Unit.UnitLevel = 2 THEN Unit.UnitId END,
    CASE WHEN Unit.UnitLevel = 3 THEN Unit.UnitId END
    FROM EmpUnit,Unit WHERE EmpUnit.UnitId = Unit.UnitId ;
      

  2.   

    补充一些说明例如员工表(Employee)中
    有如下数据EmployeeId    EmployeeName 
    001                 张三员工组织单元表(EmpUnit)中有EmployeeId           UnitId
    001                    1
    001                    2
    001                    3组织单元表(Unit)中有UnitId  UnitLevel  upLeaveUnitId
    1           1               1 
    2           2               1
    3           3               2   ------------------------------------------------------------------------我想创建一个视图,可以查出类似这样一条数据EmployeeId   UnitId(一级组织单元ID)     Unit Id(二级组织单元ID)   UnitId(三级组织单元ID)
    001                      1                   2                      3
      

  3.   

    我认为可以这样:
    ---首先看一下表示组织单元级别的个数,select distinct unitlevel from unit;
    ---从楼主给的数据看,只有三个级别的组织单位ID
    select employeeid,
           (case when unitlevel=1 then unitid end) first, 
           (case when unitlevel=2 then unitid end) second,
           (case when unitlevel=3 then unitid end) third
      from (
          select a.employeeid a.unitid b.unitlevel from empunit a,unit b
         where a.unitid=b.unitid);得到这样的数据:          一级组织     二级组织     三级组织 
    001           1 
    001                        2 
    001                                     3 ----然后再group by 一下就可以了!select employeeid,sum(nvl(first,0)),sum(nvl(second,0)),sum(nvl(third,0))
        from 
        (select employeeid,
           (case when unitlevel=1 then unitid end) first, 
           (case when unitlevel=2 then unitid end) second,
           (case when unitlevel=3 then unitid end) third
      from (
          select a.employeeid a.unitid b.unitlevel from empunit a,unit b
         where a.unitid=b.unitid))
      group by employeeid;---这样就可以得到想要的数据了,如果你想得到部门的名称,就可以再和表Employee联合查询一下就OK了!