zoukankan      html  css  js  c++  java
  • SSE项目小总结

    前段时间给一电力公司做一套窗口服务人员星级评定管理系统,类似大家上银行办完事后用柜台上的按扭对服务人员进行服务评定!
      是朋友接的一项目,我去帮忙,主要是做报表这块,说到难点可能就是里面的对这些数据进行汇总及报表了,由于表结构设计的不同,可能会对查询带来不利。在这将自己遇到的问题及解决的办法记下!
      先看看部门表结构,如下:

    在这里用了一张表存放了各部门及之间的关系,大致分三类,第一类,也就是最大类:为全局!其ID为10
      次之为各市级别的分公司, 可以看到ID为 1010 至1016
      最后为各县市的营业所,ID为六位 101010至101610,这一整张表存放了所有部门及说明了它们之间的关系,利用的是左右节点Lft,Rgt来归类。

      再看职工表

    可以看到其中有相应的职工ID及所属部门ID(哪个营业所)

      再看职工业绩周汇表
    可以看到其中有用户ID,及所属部门ID以及服务数,较好,一般,差评,放弃,好评率,评价率,及第几服务周,月,年等数据!

      涉及到的三张表结构就如此,现在来看下要求功能
      首先是要按营业所得到该营业所各职工的业务报表 UI如下:

    点击后


    根据营业所得到报表还是比较容易的,直接通过基业所ID 如(101410)即可得到

      再一个要求按市级别分公司查,得到其下属各营业所的业务报表 (营业所业绩当然又是由职工创造的)


    点击后

    这一步根据市级别公司的ID 如(1010)由表一可以知道其为崇阳供电公司,则再根据 1010 在 部门表中 查找出 其lft rgt左右节点
      2 和 7 再查出左右节点在2和7 之间的部门可以得到  101010(崇阳城关营业所)  及  101011(崇阳天城营业所)然后再根据101010及101011这二个ID查出相应的报表。之后的过程就与功能一 按营业所查相似了!
      可以看到这一步就有点麻烦了~

      最后也即是按全局查寻各市级别分公司的业务报表(分公司又是由营业所组成,营业所业绩又与职工业绩有关!)

    点击后

     这一步根据 全局的 ID  10查询,可以在周报表中看到,数据都是以职工存储的,而职工又都是以营业所划分,该表中没有字段表明其属于哪家分公司,其营业所ID类似 101010 101011 101111……现在要根据全局ID为 10 得到各分公司的 报表。
      现在粗看要在该表中分组查询,类似这样就好,能以 1010**(1010开头的营业所为崇阳供电公司),1011**(1011开头的营业所为通山供电公司)类似这样的部门ID数据的汇总,如下表:

    我们要求 部门ID为 101310 和 101311 的数据汇总~前4位数字一样~似乎有点难了,SQL没有为我们直接提供这样的查询!

      想个办法以另外一种方式查!
      其实已经有点规律性的东西: 全局ID 为 10  而二级部门 也即为 各市级别分公司的 ID 以 10 开头 并且只有 4位数据~如1013。营业所ID为 对应的 分公司 1013开头再+2位,即六位(如101310 和 101311)!现在要根据ID=10查询出这些营业所来~并且按市公司分组~

    主要SQL存储过程如下:

    DECLARE @len int
    SET @len=LEN(@ObjID)    --得到传入ID的长度10  为 2
    insert into @tblTemp SELECT  a.DepartmentID,LEFT(a.DepartmentID,4as deID ,--将得到的营业所ID截取到4位长度 如101310和101311的结果为1013
    SUM(a.BetterCount) as BetterCount ,SUM(a.GoodCount) as GoodCount,
            
    SUM(a.BadCount) as BadCount,SUM(a.AbortCount) as AbortCount
        
    FROM WeekTotal a 
        
    WHERE a.[Year]=@year 
        
    AND  LEFT(a.DepartmentID,@len)=@ObjID --营业所ID截取全局ID =10的长度,也即为截取到2位后的结果要与传入的全局值10相等
        AND LEN(a.DepartmentID)=@len+4        --同时保证取到的为营业所的数据,所以ID长度为 6 (这样排除了分公司ID为4 的)
        GROUP BY a.DepartmentID
    将上面查询出的数据保存在临时表中
    DECLARE @tblTemp TABLE(
    ObjID 
    bigint,
    deID 
    bigint,
    BetterCount 
    int,
    GoodCount 
    int,
    BadCount 
    int,
    AbortCount 
    int
    )
    insert into @tblTemp SELECT  a.DepartmentID,LEFT(a.DepartmentID,4as deID ,SUM(a.BetterCount) as BetterCount ,SUM(a.GoodCount) as GoodCount,
            
    SUM(a.BadCount) as BadCount,SUM(a.AbortCount) as AbortCount
        
    FROM WeekTotal a 
        
    WHERE a.[Year]=@year 
        
    AND  LEFT(a.DepartmentID,@len)=@ObjID AND LEN(a.DepartmentID)=@len+4  
        
    GROUP BY a.DepartmentID
    这样可以得到类似下面的查询

    可以看到我们得到了按营业所汇总的数据,关键在于 部门ID 为101010 101011这样开头的记录中 多了一个字段为 depID并且值 均为相应部门ID的前四位!如 101010 101011 的depID均为 1010 好即是 崇阳供电公司!因为接下来要做的就是 根据字段列depID 相同的 再进行汇总。
    select deID,RepeateObjIDCount=count(deID),BetterCount=sum(BetterCount),GoodCount=sum(GoodCount),
        BadCount
    =sum(BadCount) , AbortCount=sum(AbortCount)  ,
    total
    =ISNULL(sum(BetterCount)+sum(GoodCount)+sum(BadCount)+sum(AbortCount),0) ,
    ISNULL(CAST(CAST((sum(BetterCount)+sum(GoodCount)+sum(BadCount)) AS numeric)/(CASE sum(BetterCount)+sum(GoodCount)+sum(BadCount)+sum(AbortCount) WHEN 0 THEN 1 ELSE sum(BetterCount)+sum(GoodCount)+sum(BadCount)+sum(AbortCount) ENDAS numeric(5,2)),0.00AS Present,
    departmentname 
    from   @tblTemp a  join departments b on a.deID=b.departmentID
          
    group by deID,departmentname having count(*)>0 order by deID 
    可以看到按 deID,departmentname (这里的deID即为刚才的1010 ,1011……而departmentname即为分公司的名称)进行分组即可得到要求!

    需要说明的是类似下面的表

    若要按部门名进行汇总数据可以如下查询

  • 相关阅读:
    DIV 实现可拖拽 功能(留档)
    JS网站当前日期在IE9、Chrome和FireFox中年份显示为113年的解决方法 getFullYear();
    ASP.Net MVC C#画图 页面调用
    iOS NSDecimalNumber 货币计算 四舍五入
    [日记]寒假发生了什么
    [其他]寒假作业是什么
    [考试总结]近期第一次在下午考的一场考试
    [考试总结]不写部分分下场会很惨的一场考试
    [考试总结]毒瘤题×4的一场考试
    [考试总结]出数据变成做构造题的一场考试
  • 原文地址:https://www.cnblogs.com/eflylab/p/778345.html
Copyright © 2011-2022 走看看