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即为分公司的名称)进行分组即可得到要求!

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

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

posted on 2007-06-10 17:32  冯岩  阅读(840)  评论(0编辑  收藏  举报

导航