要为公司设计一个比较简单的统计软件,公司的组织结构如下:
          总部
          区域分部1              区域分部2         .....
          门店1   门店2 ...      门店3    门店4    ...
          员工a   员工b ...............................
总部下设几个区域分部,每个区域分部下有若干门店,每个门店中有若干员工, 
要可以分别统计员工,门店,区域,总部的某一时段的销售业绩。
在发生员工调动,比如从门店1调到门店2,或某个门店划到另个区域时,也要统计准确。
我想了好长时间了,不知到数据库如何设计比较合理。  

解决方案 »

  1.   

    区域表
    id name 其他字段
    1  第1区域
    2  第2区域门店表
    id name 区域id(对应区域的ID) 其他字段
    1  第1门店 1
    2  第2门店 1
    3  第3门店 2
    员工表
    id name 门店id(对应门店的ID) 其他字段
    1  第1员工 1
    2  第2员工 2
    3  第3员工 1
    4  第4员工 3
    5  第5员工 1
    6  第6员工 2然后三表根据相关字段关联并进行统计。
      

  2.   

    做法完全同3楼
    这种情况我做过
    主要是营业员的归属需要两个表
    一个是营业员信息表
    一个是营业员信息快照表,快照以月归类
    月份|ID|NAME|所属服营厅
      

  3.   


    其实说白了就是进销存来的。
    第一个问题:可以分别统计员工,门店,区域,总部的某一时段的销售业绩区域部门的设计成树型结构,用一个表就可以了:
    区域A
      |__部门A1
      |__部门A2
    区域B
      |__部门B1
      |__部门B2 在销售单设计主、从表:
    主表:制单日期、单号、客户、制单人、部门
    从表:商品、单价、数量、仓库。员工就是当前的制单人,为了方便,把部门与员工对应起来,这样不管员工调到什么部门去,只要选择了部门,就自动把员工默认出来。
    部门就关联到区域部门里去,这样在统计部门时,如果选择一级时,则把下一级统计出来,参看树型结构。第二次个问题:在发生员工调动,比如从门店1调到门店2,或某个门店划到另个区域时这个在第一个问题里已经说明了。这样做就可以实现的要求了。
      

  4.   

    谢谢15楼,
    我现在的最大的困惑不是统计当前的业绩,而是如果有变动的准确统计,比如2009年1月1日的状态
    区域A
      |__部门A1
          |__员工1__员工2__员工3
      |__部门A2
    区域B
      |__部门B1
      |__部门B2 2009年3月15日到目前的状态区域A  
      |__部门A2
           |__员工3区域B
      |__部门A1
          |__员工1__员工2
      |__部门B1
      |__部门B2 统计业绩时:
    2009.1.1-2009.3.15日
    部门A1及下属员工1、员工2、员工3的业绩计入区域A
    2009.3.15-现在
    部门A1及下属员工1、员工2业绩计入部门a1
    员工3的业绩计入部门A2实际情况比这还要复杂些,头痛在这里
      

  5.   

    不好意思上面的回复错了
    谢谢15楼,
    我现在的最大的困惑不是统计当前的业绩,而是如果有变动的准确统计,比如2009年1月1日的状态
    区域A
      |__部门A1
          |__员工1__员工2__员工3
      |__部门A2
    区域B
      |__部门B1
      |__部门B2  2009年3月15日到目前的状态区域A   
      |__部门A2
          |__员工3区域B
      |__部门A1
          |__员工1__员工2
      |__部门B1
      |__部门B2  统计业绩时:
    2009.1.1-2009.3.15日
    部门A1及下属员工1、员工2、员工3的业绩计入区域A
    2009.3.15-现在
      部门A1及下属员工1、员工2业绩计入区域B
      员工3的业绩计入区域A
    实际情况比这还要复杂些,头痛在这里!!
     
     
     
    对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP  
      

  6.   

    楼主的思考有深度!(数据库建模可不是随随便便的哟..)
    建议:
    1)可以借鉴数据仓库建模理论中 SCD Type 2 的建模方法:在与时间变化有关的表里增加 Audit 字段。
    2)可以参考 SQL Server 2008 实例数据库 AdventureWorksDW 中的建模方法,它们都遵守了实践证明是非常有效和规范的建模理论。
      

  7.   

    0----这个样子?
    --测试数据   深度排序     
      DECLARE   @t   TABLE(ID   char(3),PID   char(3),Name   nvarchar(10))   
      INSERT   @t   SELECT   '001',NULL   ,'山东省'   
      UNION   ALL   SELECT   '002','001','烟台市'   
      UNION   ALL   SELECT   '004','002','招远市'   
      UNION   ALL   SELECT   '003','001','青岛市'   
      UNION   ALL   SELECT   '005',NULL   ,'四会市'   
      UNION   ALL   SELECT   '006','005','清远市'   
      UNION   ALL   SELECT   '007','006','小分市'   
        
      --深度排序显示处理   
      --生成每个节点的编码累计(相同当单编号法的编码)   
      DECLARE   @t_Level   TABLE(ID   char(3),Level   int,Sort   varchar(8000))   
      DECLARE   @Level   int   
      SET   @Level=0   
      INSERT   @t_Level   SELECT   ID,@Level,ID   
      FROM   @t   
      WHERE   PID   IS   NULL   
      WHILE   @@ROWCOUNT>0   
      BEGIN   
      SET   @Level=@Level+1   
      INSERT   @t_Level   SELECT   a.ID,@Level,b.Sort+a.ID   
      FROM   @t   a,@t_Level   b   
      WHERE   a.PID=b.ID   
      AND   b.Level=@Level-1   
      END   
        
      --显示结果   
      SELECT   a.*   
      FROM   @t   a,@t_Level   b   
      WHERE   a.ID=b.ID   
      ORDER   BY   b.Sort   
      /*--结果   
      ID       PID       Name                 
      ------   ---------   ----------     
      001     NULL   山东省   
      002     001       烟台市   
      004     002       招远市   
      003     001       青岛市   
      005     NULL   四会市   
      006     005       清远市   
      007     006       小分市   
      --*/--查询指定节点及其所有子节点的函数   
      CREATE   FUNCTION   f_Cid(@ID   char(3))   
      RETURNS   @t_Level   TABLE(ID   char(3),Level   int)   
      AS   
      BEGIN   
      DECLARE   @Level   int   
      SET   @Level=1   
      INSERT   @t_Level   SELECT   @ID,@Level   
      WHILE   @@ROWCOUNT>0   
      BEGIN   
      SET   @Level=@Level+1   
      INSERT   @t_Level   SELECT   a.ID,@Level   
      FROM   tb   a,@t_Level   b   
      WHERE   a.PID=b.ID   
      AND   b.Level=@Level-1   
      END   
      RETURN   
      END   
      GO   
        
      --调用函数查询002及其所有子节点   
      SELECT   a.*   
      FROM   tb   a,f_Cid('002')   b   
      WHERE   a.ID=b.ID   
      /*--结果   
      ID       PID     Name                 
      ------   -------   ----------     
      002     001     烟台市   
      004     002     招远市   
      --*/ --测试数据
    DECLARE @t TABLE(ID char(3),PID char(3),Name nvarchar(10))
    INSERT @t SELECT '001',NULL ,'山东省'
    UNION ALL SELECT '002','001','烟台市'
    UNION ALL SELECT '004','002','招远市'
    UNION ALL SELECT '003','001','青岛市'
    UNION ALL SELECT '005',NULL ,'四会市'
    UNION ALL SELECT '006','005','清远市'
    UNION ALL SELECT '007','006','小分市'--深度排序显示处理
    --生成每个节点的编码累计(相同当单编号法的编码)
    DECLARE @t_Level TABLE(ID char(3),Level int,Sort varchar(8000))
    DECLARE @Level int
    SET @Level=0
    INSERT @t_Level SELECT ID,@Level,ID
    FROM @t
    WHERE PID IS NULL
    WHILE @@ROWCOUNT>0
    BEGIN
        SET @Level=@Level+1
        INSERT @t_Level SELECT a.ID,@Level,b.Sort+a.ID
        FROM @t a,@t_Level b
        WHERE a.PID=b.ID
            AND b.Level=@Level-1
    END--显示结果
    SELECT SPACE(b.Level*2)+'|--'+a.Name
    FROM @t a,@t_Level b
    WHERE a.ID=b.ID
    ORDER BY b.Sort
    /*--结果
    |--山东省
      |--烟台市
        |--招远市
      |--青岛市
    |--四会市
      |--清远市
        |--小分市
    --*/
      

  8.   

    本人以为:不管采用何种方式,对于部门或店面或员工,
    部门名称,店面名称,员工名称是必须唯一的,不管它的上级是谁,都可以用它来统计业绩.
    部门ID,店面ID,员工ID是变化的,如一员工从一店面调到另一店面,员工名称不变,员工ID改变
    只要增加一个字段---IsActived 如果为0则表示已调离(调离后原记录还在,并新增一记录,只是其所属店面ID已更改),
    部门,店面,员工之间的上下级关系是通过ID来表示的,同样,销售记录也是通过ID来记录的,如果IsActived为0,则不再记录销售记录