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存储过程如下:
SET @len=LEN(@ObjID) --得到传入ID的长度10 为 2
insert into @tblTemp SELECT a.DepartmentID,LEFT(a.DepartmentID,4) as 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
ObjID bigint,
deID bigint,
BetterCount int,
GoodCount int,
BadCount int,
AbortCount int
)
insert into @tblTemp SELECT a.DepartmentID,LEFT(a.DepartmentID,4) as 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 相同的 再进行汇总。
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) END) AS numeric(5,2)),0.00) AS Present,
departmentname from @tblTemp a join departments b on a.deID=b.departmentID
group by deID,departmentname having count(*)>0 order by deID
需要说明的是类似下面的表
若要按部门名进行汇总数据可以如下查询