NET统计分析报表解决方案.docx

上传人:小飞机 文档编号:2100445 上传时间:2023-01-10 格式:DOCX 页数:20 大小:937.10KB
返回 下载 相关 举报
NET统计分析报表解决方案.docx_第1页
第1页 / 共20页
NET统计分析报表解决方案.docx_第2页
第2页 / 共20页
NET统计分析报表解决方案.docx_第3页
第3页 / 共20页
NET统计分析报表解决方案.docx_第4页
第4页 / 共20页
NET统计分析报表解决方案.docx_第5页
第5页 / 共20页
点击查看更多>>
资源描述

《NET统计分析报表解决方案.docx》由会员分享,可在线阅读,更多相关《NET统计分析报表解决方案.docx(20页珍藏版)》请在三一办公上搜索。

1、.NET统计分析报表解决方案1-用户订购统计分析案例 前段时间接到很多报表的工作,现拿出一些小例子与大家分享。用户需求:运营商管理员:1. 以合作伙伴为维度对用户订购进行统计分析: a. 可对某一个合作伙伴进行分析,查看该合作伙伴下产品的用户订购在某个时间段内的发展趋势,需实现折线图、柱状图。 b. 可对所有合作伙伴进行分析,对比在某段时间内所有合作伙伴下产品的用户订购发展量,查看在某段时间内所有合作伙伴下产品的用户订购发展量在订购总量中所占比例,需实现柱状图、饼状图。2. 以产品为维度对用户订购进行统计分析: a. 可对某一个产品进行分析,查看该产品的用户订购在某个时间段内的发展趋势,需实现

2、折线图、柱状图。 b. 可对所有产品进行分析,对比在某段时间内所有产品的用户订购发展量,查看在某段时间内所有产品的用户订购发展量在订购总量中所占比例,需实现柱状图、饼状图。合作伙伴管理员:1. 以产品为维度对用户订购进行统计分析: a. 可对本公司下某一个产品进行分析,查看该产品的用户订购在某个时间段内的发展趋势,需实现折线图、柱状图。 b. 可对本公司下所有产品进行分析,对比在某段时间内所有产品的用户订购发展量,查看在某段时间内所有产品的用户订购发展量在订购总量中所占比例,需实现柱状图、饼状图。时间需支持按年、按月统计。根据用户需求,我们可以开始进行实现。实现步骤:这里是用一个例子实现用户需

3、求,没有用到系统内的表,系统内的表有很多例子中不需要的字段,所以根据系统内表结构新建。1. 数据库数据表设计:合作伙伴表(CPInfo)产品信息表(ProductInfo):用户订购表(UserOrderInfo):因为是移动的系统,所以用户订购是通过手机。2. 统计分析表建立:由于现实系统数据量比较大,统计的数据也不是实时的,所以统计分析不直接在原始数据表上进行,这样我们就需要建立一个专门用来存放统计分析数据的表。用户订购统计分析表(UserOrderStat):a. StatType字段为报表类型,这里定义为:CP-按CP公司统计数据,Product-按产品统计数据b. TimeType字

4、段为时间类型,这里定义为:Year-按年统计数据,Month-按月统计数据3. 统计分析存储过程建立:按年统计存储过程:IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(Ndbo.SP_UserOrderStatByYear) AND type in (NP, NPC)DROP PROCEDURE dbo.SP_UserOrderStatByYearGO-按年统计用户订购CREATE PROCEDURE SP_UserOrderStatByYearBeginYear INT, -开始年份EndYear INT -结

5、束年份ASBEGIN DECLARE Temp_BeginYear INT DECLARE Temp_EndYear INT DECLARE BeginTime NVARCHAR(16) DECLARE EndTime NVARCHAR(16) SET Temp_BeginYear = BeginYear SET Temp_EndYear = EndYear + 1 -判断结束年份是否为当前时间年份或大于当前时间年份 IF EndYear = YEAR(GETDATE() SET Temp_EndYear = YEAR(GETDATE() SET BeginTime = CAST(Temp_B

6、eginYear AS NVARCHAR(8) + -1-1 SET EndTime = CAST(Temp_EndYear AS NVARCHAR(8) + -1-1 -添加年统计数据 INSERT INTO UserOrderStat ( StatType, TimeType, Year, CPCode, CPChName, ProductCode, ProductName, OrderCount ) -按CP公司统计 SELECT CP, Year, YEAR(uoi.OrderTime), uoi.CPCode, MAX(c.CPChName), , , COUNT(0) FROM U

7、serOrderInfo uoi JOIN CPInfo c ON uoi.CPCode = c.CPCode JOIN ProductInfo p ON uoi.ProductCode = p.ProductCode WHERE uoi.Status = 1 AND uoi.OrderTime BeginTime AND uoi.OrderTime BeginTime AND uoi.OrderTime YEAR(GETDATE() OR (EndYear = YEAR(GETDATE() AND EndMonth MONTH(GETDATE() BEGIN SET Temp_EndYear

8、 = YEAR(GETDATE() SET Temp_EndMonth = MONTH(GETDATE() END SET BeginTime = CAST(Temp_BeginYear AS NVARCHAR(8) + - + CAST(BeginMonth AS NVARCHAR(8) + -1 SET EndTime = CAST(Temp_EndYear AS NVARCHAR(8) + - + CAST(EndMonth AS NVARCHAR(8) + -1 -添加月统计数据 INSERT INTO UserOrderStat ( StatType, TimeType, Year,

9、 Month, CPCode, CPChName, ProductCode, ProductName, OrderCount ) -按CP公司统计 SELECT CP, Month, YEAR(uoi.OrderTime), MONTH(uoi.OrderTime), uoi.CPCode, MAX(c.CPChName), , , COUNT(0) FROM UserOrderInfo uoi JOIN CPInfo c ON uoi.CPCode = c.CPCode JOIN ProductInfo p ON uoi.ProductCode = p.ProductCode WHERE u

10、oi.Status = 1 AND uoi.OrderTime BeginTime AND uoi.OrderTime BeginTime AND uoi.OrderTime EndTime AND NOT EXISTS (SELECT 0 FROM UserOrderStat uos WHERE uos.CPCode = uoi.CPCode AND uos.ProductCode = uoi.ProductCode AND uos.Year = YEAR(uoi.OrderTime) AND uos.Month = MONTH(uoi.OrderTime) GROUP BY uoi.Pro

11、ductCode, YEAR(uoi.OrderTime), MONTH(uoi.OrderTime)ENDGO4. 新建数据库作业,用来定时执行年统计存储过程和月统计存储过程,一个用来执行月统计存储过程,计划为每月的1日零点执行。至此数据准备工作完成,现在开始着手设计报表。在例子中用三层架构的方式实现,分为UI层、业务逻辑层、数据访问层。5. 新建用户统计报表工程解决方案统计分析数据查询存储过程:-统计查询存储过程CREATE PROCEDURE dbo.SP_UserOrderStatQueryStatType NVARCHAR(32),TimeType NVARCHAR(32),Begi

12、nYear INT,EndYear INT,BeginMonth INT,EndMonth INT,CPCode NVARCHAR(32),CPName NVARCHAR(256),ProductCode NVARCHAR(32),ProductName NVARCHAR(256)ASBEGIN -查询字段 DECLARE Field NVARCHAR(512) -查询条件 DECLARE Where NVARCHAR(512) -按范围查询时间字段 DECLARE Time NVARCHAR(256) -分组 DECLARE Group NVARCHAR(256) -排序 DECLARE O

13、rder NVARCHAR(256) -设置查询字段 SET Field = NMAX(SeqNo) AS SeqNo,MAX(StatType) AS StatType,MAX(TimeType) AS TimeType, MAX(Year) AS Year,MAX(Month) AS Month,MAX(CPCode) AS CPCode,MAX(CPChName) AS CPChName, MAX(ProductCode) AS ProductCode,MAX(ProductName) AS ProductName,MAX(OrderCount) AS OrderCount SET Ti

14、me = -如果时间条件都未选择,则查询总时间段 IF BeginYear = -1 AND EndYear = -1 AND BeginMonth = -1 AND EndMonth = -1 SET Time = ,总时间段 AS Time -如果年为时间条件,并且开始年与结束年相等 IF BeginYear -1 AND EndYear -1 AND BeginYear = EndYear AND BeginMonth = -1 AND EndMonth = -1 SET Time = , + CAST(BeginYear AS NVARCHAR(8) + 年 AS Time -如果年为

15、时间条件,并且开始年与结束年不相等 IF BeginYear -1 AND EndYear -1 AND BeginYear EndYear AND BeginMonth = -1 AND EndMonth = -1 SET Time = , + CAST(BeginYear AS NVARCHAR(8) + 年 - + CAST(EndYear AS NVARCHAR(8) + 年 AS Time -如果年和月为时间条件,并且开始年与结束年相等,开始月与结束月相等 IF BeginYear -1 AND EndYear -1 AND BeginYear = EndYear AND Begin

16、Month -1 AND EndMonth -1 AND BeginMonth = EndMonth SET Time = , + CAST(BeginYear AS NVARCHAR(8) + 年 + CAST(BeginMonth AS NVARCHAR(8) + 月 AS Time -如果年和月为时间条件,并且开始年与结束年相等或者开始年与结束年不相等,开始月与结束月不相等 IF BeginYear -1 AND EndYear -1 AND BeginMonth -1 AND EndMonth -1 AND (BeginYear = EndYear AND BeginMonth End

17、Month) OR (BeginYear EndYear AND BeginMonth EndMonth) SET Time = , + CAST(BeginYear AS NVARCHAR(8) + 年 + CAST(BeginMonth AS NVARCHAR(8) + 月 - + CAST(EndYear AS NVARCHAR(8) + 年 + CAST(EndMonth AS NVARCHAR(8) + 月 AS Time SET Field = Field + Time SET Where = WHERE 1=1 -如果时间类型不为按时间范围查询 IF TimeType Area

18、SET Where = Where + AND TimeType = + TimeType + -如果StatType不为空 IF StatType AND StatType IS NOT NULL SET Where = Where + AND StatType = + StatType + -如果CPCode不为空 IF CPCode AND CPCode IS NOT NULL SET Where = Where + AND CPCode = + CPCode + -如果CPName不为空 IF CPName AND CPName IS NOT NULL SET Where = Wher

19、e + AND CPName LIKE % + CPName + % -如果ProductCode不为空 IF ProductCode AND ProductCode IS NOT NULL SET Where = Where + AND ProductCode = + ProductCode + -如果ProductName不为空 IF ProductName AND ProductName IS NOT NULL SET Where = Where + AND ProductName = % + ProductName + % IF BeginYear -1 AND EndYear -1

20、SET Where = Where + AND (Year = + CAST(BeginYear AS NVARCHAR(8) + AND YEAR = + CAST(EndYear AS NVARCHAR(8) + ) IF BeginMonth -1 AND EndMonth -1 SET Where = Where + OR (Month = + CAST(BeginMonth AS NVARCHAR(8) + AND Month = + CAST(EndMonth AS NVARCHAR(8) + ) IF BeginYear -1 AND EndYear -1 SET Where =

21、 Where + ) SET Group = GROUP BY IF StatType = CP SET Group = Group + CPCode IF StatType = Product SET Group = Group + ProductCode IF TimeType = Year SET Group = Group + ,Year IF TimeType = Month SET Group = Group + ,Month PRINT SELECT + Field + FROM UserOrderStat + Where + Group EXECUTE (SELECT + Fi

22、eld + FROM UserOrderStat + Where + Group)ENDGO数据访问类:UserOrderStatDAL.cs在这里用到了企业库进行数据库操作using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Data;using System.Data.Common;using Microsoft.Practices.EnterpriseLibrary.Data;namespace DAL public partial class User

23、OrderStatDAL / / 获取用户订购统计分析数据 / / 统计类型:CP-按CP统计,Product-按产品统计 / 时间类型:Year-按年统计,Month-按月统计,Area-按时间范围统计 / 统计开始年份 / 统计结束年份 / 统计开始月份 / 统计结束月份 / CP编码 / CP名称 / 产品编码 / 产品名称 / public static DataSet GetUserOrderStatData(string statType, string timeType, int beginYear, int endYear, int beginMonth, int endMon

24、th, string cpCode, string cpName, string productCode, string productName) /创建Database对象 Database db = DatabaseFactory.CreateDatabase(ReportDBConnection); /创建DbCommand对象 DbCommand dbCommand = db.GetStoredProcCommand(SP_UserOrderStatQuery); /添加输入输出参数 db.AddInParameter(dbCommand, StatType, DbType.Strin

25、g, statType); db.AddInParameter(dbCommand, TimeType, DbType.String, timeType); db.AddInParameter(dbCommand, BeginYear, DbType.Int32, beginYear); db.AddInParameter(dbCommand, EndYear, DbType.Int32, endYear); db.AddInParameter(dbCommand, BeginMonth, DbType.Int32, beginMonth); db.AddInParameter(dbComma

26、nd, EndMonth, DbType.Int32, endMonth); db.AddInParameter(dbCommand, CPCode, DbType.String, cpCode); db.AddInParameter(dbCommand, CPName, DbType.String, cpName); db.AddInParameter(dbCommand, ProductCode, DbType.String, productCode); db.AddInParameter(dbCommand, ProductName, DbType.String, productName

27、); return db.ExecuteDataSet(dbCommand); 业务逻辑层:UserOrderStatBLL.csusing System;using System.Collections.Generic;using System.Linq;using System.Text;using DAL;using System.Data;namespace BLL public class UserOrderStatBLL / / 获取用户订购统计分析数据 / / 统计类型:CP-按CP统计,Product-按产品统计 / 时间类型:Year-按年统计,Month-按月统计,Area

28、-按时间范围统计 / 统计开始年份 / 统计结束年份 / 统计开始月份 / 统计结束月份 / CP编码 / CP名称 / 产品编码 / 产品名称 / public static DataSet GetUserOrderStatData(string statType, string timeType, int beginYear, int endYear, int beginMonth, int endMonth, string cpCode, string cpName, string productCode, string productName) try /调用DAL层方法 return

29、 UserOrderStatDAL.GetUserOrderStatData(statType, timeType, beginYear, endYear, beginMonth, endMonth, cpCode, cpName, productCode, productName); catch (Exception ex) /在此处记录异常日志,并抛出异常 throw ex; 在这个例子里,这一层没有起到任何作用,但是在实际的系统里这一层是必须的。6. 新建数据集:在UI层中新建一个数据集在数据集中添加一个DataTable7. 新建报表文件:在本例子中使用rdlc报表报表文件新建后,从工

30、具栏中拖一个饼状图到设计器然后从网站数据源中将相应字段拖到饼状图中,如下:数据字段放置报表统计字段,类别字段决定报表统计字段按什么进行分类,而序列字段是在分类的基础上再进行细分。在这例子里只演示按CP统计用户订购量,所以只需要将订购量拖到数据字段,将CP编码或CP名称拖到类别字段便可。可以为报表添加输入参数,在报表菜单下报表参数内进行添加,在本例子中我添加了一个title参数和一个bottom参数。到此一个报表文件便设计完成。8. 新建报表展示页面:UserOrderStat.aspx!DOCTYPE html PUBLIC -/W3C/DTD XHTML 1.0 Transitional/EN http:/www.w3.org/TR/

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号