数据统计是每个系统中必备的功能,在给领导汇报统计数据,工作中需要的进展数据时非常有用。
在我看来,一个统计的模块应该实现以下功能:
能够将常用的查询的统计结果显示出来;
显示的结果可以是表格形式,也可以是图形形式,如果是图形的话能够以多种形式显示(柱状图、折线图、饼图、雷达图、堆叠柱状图等):
统计查询的结果,点击数字或者百分比能够显示详细的数据;
能够自由组合查询条件、筛选条件、分组条件、排序等;
统计结果最好有个实时预览;
查询统计能够保存,以便下次能直接调用并显示统计查询的结果;
对于保存后的查询统计,下次调用时也可以按照灵活的筛选手段对查询结果进行筛选;
界面需要做的简洁、直观,就算是不太懂电脑的操作员也能够方便使用;
对于一些复杂的查询,能够直接在后台写Sql或者调用Sp出数据
......
好了,以下是在实际环境中的实现和应用:
这是一个学生的就业系统,学生在不同的时期会对自己毕业去向进行登记,因此按照不同时间截点统计出来的数据是不一样的。数据表有100多个字段(并不是所有字段都需要统计)。
首先,我们在数据库中构建一个表值函数,能够按照不同的时间截点返回出数据,表也起到视图的作用,将参数表的值直接包含到返回结果中去。
ALTER FUNCTION [dbo].[Get.............] ( @gxsj datetime ) RETURNS TABLE AS RETURN ( select t1.*, dbo.depacode.xymc, CASE t1.xldm WHEN '01' THEN '博士' WHEN '11' THEN '硕士' WHEN '25' THEN '双学位' WHEN '31' THEN '本科' WHEN '41' THEN '专科' WHEN '61' THEN '高职' ELSE '' END AS xlmc, CASE WHEN LEFT(t1.sydqdm, 2) IN ('11', '12', '13', '21', '31', '32', '33', '35', '37', '44', '46', '71', '81', '82') THEN '东部' WHEN LEFT(t1.sydqdm, 2) IN ('14', '22', '23', '34', '36', '41', '42', '43') THEN '中部' WHEN LEFT(t1.sydqdm, 2) IN ('15', '45', '51', '50', '52', '53', '54', '61', '62', '65', '63', '64') THEN '西部' ELSE '' END AS sydq, sydq.dwdqmc AS sysf, CASE WHEN LEFT(t1.dwdqdm, 2) IN ('11', '12', '13', '21', '31', '32', '33', '35', '37', '44', '46', '71', '81', '82') THEN '东部' WHEN LEFT(t1.dwdqdm, 2) IN ('14', '22', '23', '34', '36', '41', '42', '43') THEN '中部' WHEN LEFT(t1.dwdqdm, 2) IN ('15', '45', '51', '50', '52', '53', '54', '61', '62', '65', '63', '64') THEN '西部' ELSE '' END AS dwdq, dwdq.dwdqmc AS dwsf, dbo.Entcode.hyname, dbo.hydygx.hymldm, dbo.hydygx.hyml, CASE t1.xbdm WHEN 1 THEN '男' WHEN 2 THEN '女' ELSE '男' END AS xbmc, [mzdmb].[nation] AS mzmc, [EjByqxdmb].[Ejbyqxmc], dbo.byqxdygx.jybbyqx, t1.gn500 AS jybdwxzdm, CASE t1.knslbdm WHEN '7' THEN '就业困难、家庭困难和残疾' WHEN '6' THEN '家庭困难和残疾' WHEN '5' THEN '就业困难和残疾' WHEN '4' THEN '残疾' WHEN '3' THEN '就业和家庭困难' WHEN '2' THEN '家庭困难' WHEN '1' THEN '就业困难' ELSE '非困难生' END AS Knslb from [table] as t1 LEFT OUTER JOIN dbo.depacode ON t1.xydm = dbo.depacode.xydm LEFT OUTER JOIN dbo.dwdq AS sydq ON LEFT(t1.sydqdm, 2) + '0000' = sydq.dwdqdm LEFT OUTER JOIN dbo.dwdq AS dwdq ON LEFT(t1.dwdqdm, 2) + '0000' = dwdq.dwdqdm LEFT OUTER JOIN dbo.Entcode ON t1.hylb = dbo.Entcode.hycode LEFT OUTER JOIN dbo.hydygx ON t1.hylb = dbo.hydygx.hydldm LEFT OUTER JOIN [mzdmb] ON t1.mzdm = [mzdmb].[mzdm] LEFT OUTER JOIN [EjByqxdmb] ON t1.byqx2 = [EjByqxdmb].[Ejbyqxdm] LEFT OUTER JOIN dbo.byqxdygx ON t1.byqx = dbo.byqxdygx.shbyqx AND t1.dwxzdm = dbo.byqxdygx.shdwxzdm where [gxsj] <= dateadd(day,1,@gxsj) and HisId in (SELECT TOP 1 HisId FROM [table] WHERE [gxsj] <= dateadd(day,1,@gxsj) and xsxh = t1.xsxh and bynf = t1.bynf and t1.byqx not in ('08','05','11') ORDER BY [gxsj] DESC) )
这样我们使用 select * from [get...]('2016-8-25') 就可以查询出8月25日截止日期的数据。
接下来是界面设计,我们使用jequery-ui中dropable\dragable的控件,字段排列在界面上,直接拖拽到相应域里,就能够进行统计。
除了分组字段外,显示字段还能够按照具体的值进行统计过滤,起到多重分组统计的功能。
大家可以看到,最上面一栏是数据筛选,然后是系统已经保存的查询(分为表格查询和图形查询),点击保存好的查询直接出查询结果,也可以删除保存的查询。在下面是自定义查询,上面是一排条件,然后是可以拖拽的字段,当字段拖至分组列,则显示字段名称;拖至显示列,还可以对显示的数据的具体值进行分组筛选统计。下方则是一些选项,是否显示小计、总计,以何种方式显示图表。
以表格形式的显示统计,可以看到,每个数值都可以点击弹出框显示详情,最下方能够保存查询条件,以图形方式显示等:
图形的展示:
以下是核心类InquireHelper.cs:
字段实体类(部分)