NET统计分析报表解决方案.docx
《NET统计分析报表解决方案.docx》由会员分享,可在线阅读,更多相关《NET统计分析报表解决方案.docx(22页珍藏版)》请在冰豆网上搜索。
![NET统计分析报表解决方案.docx](https://file1.bdocx.com/fileroot1/2023-1/2/debaa61f-7990-46ea-8ab2-4009e1284f9f/debaa61f-7990-46ea-8ab2-4009e1284f9f1.gif)
NET统计分析报表解决方案
.NET统计分析报表解决方案1-用户订购统计分析案例
前段时间接到很多报表的工作,现拿出一些小例子与大家分享。
用户需求:
运营商管理员:
1.以合作伙伴为维度对用户订购进行统计分析:
a.可对某一个合作伙伴进行分析,查看该合作伙伴下产品的用户订购在某个时间段内的发展趋势,需实现折线图、柱状图。
b.可对所有合作伙伴进行分析,对比在某段时间内所有合作伙伴下产品的用户订购发展量,查看在某段时间内所有合作伙伴下产品的用户订购发展量在订购总量中所占比例,需实现柱状图、饼状图。
2.以产品为维度对用户订购进行统计分析:
a.可对某一个产品进行分析,查看该产品的用户订购在某个时间段内的发展趋势,需实现折线图、柱状图。
b.可对所有产品进行分析,对比在某段时间内所有产品的用户订购发展量,查看在某段时间内所有产品的用户订购发展量在订购总量中所占比例,需实现柱状图、饼状图。
合作伙伴管理员:
1.以产品为维度对用户订购进行统计分析:
a.可对本公司下某一个产品进行分析,查看该产品的用户订购在某个时间段内的发展趋势,需实现折线图、柱状图。
b.可对本公司下所有产品进行分析,对比在某段时间内所有产品的用户订购发展量,查看在某段时间内所有产品的用户订购发展量在订购总量中所占比例,需实现柱状图、饼状图。
时间需支持按年、按月统计。
根据用户需求,我们可以开始进行实现。
实现步骤:
这里是用一个例子实现用户需求,没有用到系统内的表,系统内的表有很多例子中不需要的字段,所以根据系统内表结构新建。
1.数据库数据表设计:
合作伙伴表(CPInfo)
产品信息表(ProductInfo):
用户订购表(UserOrderInfo):
因为是移动的系统,所以用户订购是通过手机。
2.统计分析表建立:
由于现实系统数据量比较大,统计的数据也不是实时的,所以统计分析不直接在原始数据表上进行,这样我们就需要建立一个专门用来存放统计分析数据的表。
用户订购统计分析表(UserOrderStat):
a.StatType字段为报表类型,这里定义为:
CP-按CP公司统计数据,Product-按产品统计数据
b.TimeType字段为时间类型,这里定义为:
Year-按年统计数据,Month-按月统计数据
3.统计分析存储过程建立:
按年统计存储过程:
IFEXISTS(SELECT*FROMsys.objectsWHEREobject_id=OBJECT_ID(N'[dbo].[SP_UserOrderStatByYear]')ANDtypein(N'P',N'PC'))
DROPPROCEDURE[dbo].[SP_UserOrderStatByYear]
GO
--按年统计用户订购
CREATEPROCEDURESP_UserOrderStatByYear
@BeginYearINT,--开始年份
@EndYearINT--结束年份
AS
BEGIN
DECLARE@Temp_BeginYearINT
DECLARE@Temp_EndYearINT
DECLARE@BeginTimeNVARCHAR(16)
DECLARE@EndTimeNVARCHAR(16)
SET@Temp_BeginYear=@BeginYear
SET@Temp_EndYear=@EndYear+1
--判断结束年份是否为当前时间年份或大于当前时间年份
IF@EndYear>=YEAR(GETDATE())
SET@Temp_EndYear=YEAR(GETDATE())
SET@BeginTime=CAST(@Temp_BeginYearASNVARCHAR(8))+'-1-1'
SET@EndTime=CAST(@Temp_EndYearASNVARCHAR(8))+'-1-1'
--添加年统计数据
INSERTINTOUserOrderStat
(
StatType,
TimeType,
[Year],
CPCode,
CPChName,
ProductCode,
ProductName,
OrderCount
)
--按CP公司统计
SELECT'CP','Year',YEAR(uoi.OrderTime),uoi.CPCode,MAX(c.CPChName),'','',COUNT(0)
FROMUserOrderInfouoiJOINCPInfocONuoi.CPCode=c.CPCode
JOINProductInfopONuoi.ProductCode=p.ProductCode
WHEREuoi.Status=1ANDuoi.OrderTime>@BeginTimeANDuoi.OrderTime<@EndTime
ANDNOTEXISTS(SELECT0FROMUserOrderStatuosWHEREuos.CPCode=uoi.CPCodeANDuos.Year=YEAR(uoi.OrderTime))
GROUPBYuoi.CPCode,YEAR(uoi.OrderTime)
UNION
--按产品统计
SELECT'Product','Year',YEAR(uoi.OrderTime),MAX(uoi.CPCode),MAX(c.CPChName),uoi.ProductCode,MAX(p.ProductName),COUNT(0)
FROMUserOrderInfouoiJOINCPInfocONuoi.CPCode=c.CPCode
JOINProductInfopONuoi.ProductCode=p.ProductCode
WHEREuoi.Status=1ANDuoi.OrderTime>@BeginTimeANDuoi.OrderTime<@EndTime
ANDNOTEXISTS(SELECT0FROMUserOrderStatuosWHEREuos.CPCode=uoi.CPCode
ANDuos.ProductCode=uoi.ProductCodeANDuos.Year=YEAR(uoi.OrderTime))
GROUPBYuoi.ProductCode,YEAR(uoi.OrderTime)
END
GO
按月统计存储过程:
IFEXISTS(SELECT*FROMsys.objectsWHEREobject_id=OBJECT_ID(N'[dbo].[SP_UserOrderStatByMonth]')ANDtypein(N'P',N'PC'))
DROPPROCEDURE[dbo].[SP_UserOrderStatByMonth]
GO
--按月统计用户订购
CREATEPROCEDURESP_UserOrderStatByMonth
@BeginYearINT,--开始年份
@BeginMonthINT,--开始月份
@EndYearINT,--结束年份
@EndMonthINT--结束月份
AS
BEGIN
DECLARE@Temp_BeginYearINT
DECLARE@Temp_BeginMonthINT
DECLARE@Temp_EndYearINT
DECLARE@Temp_EndMonthINT
DECLARE@BeginTimeNVARCHAR(16)
DECLARE@EndTimeNVARCHAR(16)
SET@Temp_BeginYear=@BeginYear
SET@Temp_BeginMonth=@BeginMonth
SET@Temp_EndYear=@EndYear
SET@Temp_EndMonth=@EndMonth+1
--判断结束年份是否大于当前时间年份,当前月份是否为1月或者判断结束年份是否等于当前时间年份,结束月份是否大于当前时间月份
IF@EndYear>YEAR(GETDATE())OR(@EndYear=YEAR(GETDATE())AND@EndMonth>MONTH(GETDATE()))
BEGIN
SET@Temp_EndYear=YEAR(GETDATE())
SET@Temp_EndMonth=MONTH(GETDATE())
END
SET@BeginTime=CAST(@Temp_BeginYearASNVARCHAR(8))+'-'+CAST(@BeginMonthASNVARCHAR(8))+'-1'
SET@EndTime=CAST(@Temp_EndYearASNVARCHAR(8))+'-'+CAST(@EndMonthASNVARCHAR(8))+'-1'
--添加月统计数据
INSERTINTOUserOrderStat
(
StatType,
TimeType,
[Year],
[Month],
CPCode,
CPChName,
ProductCode,
ProductName,
OrderCount
)
--按CP公司统计
SELECT'CP','Month',YEAR(uoi.OrderTime),MONTH(uoi.OrderTime),uoi.CPCode,MAX(c.CPChName),'','',COUNT(0)
FROMUserOrderInfouoiJOINCPInfocONuoi.CPCode=c.CPCode
JOINProductInfopONuoi.ProductCode=p.ProductCode
WHEREuoi.Status=1ANDuoi.OrderTime>@BeginTimeANDuoi.OrderTime<@EndTime
ANDNOTEXISTS(SELECT0FROMUserOrderStatuosWHEREuos.CPCode=uoi.CPCode
ANDuos.Year=YEAR(uoi.OrderTime)ANDuos.Month=MONTH(uoi.OrderTime))
GROUPBYuoi.CPCode,YEAR(uoi.OrderTime),MONTH(uoi.OrderTime)
UNION
--按产品统计
SELECT'Product','Month',YEAR(uoi.OrderTime),MONTH(uoi.OrderTime),MAX(uoi.CPCode),MAX(c.CPChName),uoi.ProductCode,MAX(p.ProductName),COUNT(0)
FROMUserOrderInfouoiJOINCPInfocONuoi.CPCode=c.CPCode
JOINProductInfopONuoi.ProductCode=p.ProductCode
WHEREuoi.Status=1ANDuoi.OrderTime>@BeginTimeANDuoi.OrderTime<@EndTime
ANDNOTEXISTS(SELECT0FROMUserOrderStatuosWHEREuos.CPCode=uoi.CPCode
ANDuos.ProductCode=uoi.ProductCodeANDuos.Year=YEAR(uoi.OrderTime)ANDuos.Month=MONTH(uoi.OrderTime))
GROUPBYuoi.ProductCode,YEAR(uoi.OrderTime),MONTH(uoi.OrderTime)
END
GO
4.新建数据库作业,用来定时执行年统计存储过程和月统计存储过程,一个用来执行月统计存储过程,计划为每月的1日零点执行。
至此数据准备工作完成,现在开始着手设计报表。
在例子中用三层架构的方式实现,分为UI层、业务逻辑层、数据访问层。
5.新建用户统计报表工程解决方案
统计分析数据查询存储过程:
--统计查询存储过程
CREATEPROCEDURE[dbo].[SP_UserOrderStatQuery]
@StatTypeNVARCHAR(32),
@TimeTypeNVARCHAR(32),
@BeginYearINT,
@EndYearINT,
@BeginMonthINT,
@EndMonthINT,
@CPCodeNVARCHAR(32),
@CPNameNVARCHAR(256),
@ProductCodeNVARCHAR(32),
@ProductNameNVARCHAR(256)
AS
BEGIN
--查询字段
DECLARE@FieldNVARCHAR(512)
--查询条件
DECLARE@WhereNVARCHAR(512)
--按范围查询时间字段
DECLARE@TimeNVARCHAR(256)
--分组
DECLARE@GroupNVARCHAR(256)
--排序
DECLARE@OrderNVARCHAR(256)
--设置查询字段
SET@Field=N'MAX([SeqNo])ASSeqNo,MAX([StatType])ASStatType,MAX([TimeType])ASTimeType,
MAX([Year])ASYear,MAX([Month])ASMonth,MAX([CPCode])ASCPCode,MAX([CPChName])ASCPChName,
MAX([ProductCode])ASProductCode,MAX([ProductName])ASProductName,MAX([OrderCount])ASOrderCount'
SET@Time=''
--如果时间条件都未选择,则查询总时间段
IF@BeginYear=-1AND@EndYear=-1AND@BeginMonth=-1AND@EndMonth=-1
SET@Time=',''总时间段''AS[Time]'
--如果年为时间条件,并且开始年与结束年相等
IF@BeginYear<>-1AND@EndYear<>-1AND@BeginYear=@EndYearAND@BeginMonth=-1AND@EndMonth=-1
SET@Time=','''+CAST(@BeginYearASNVARCHAR(8))+'年''AS[Time]'
--如果年为时间条件,并且开始年与结束年不相等
IF@BeginYear<>-1AND@EndYear<>-1AND@BeginYear<>@EndYearAND@BeginMonth=-1AND@EndMonth=-1
SET@Time=','''+CAST(@BeginYearASNVARCHAR(8))+'年-'+CAST(@EndYearASNVARCHAR(8))+'年''AS[Time]'
--如果年和月为时间条件,并且开始年与结束年相等,开始月与结束月相等
IF@BeginYear<>-1AND@EndYear<>-1AND@BeginYear=@EndYear
AND@BeginMonth<>-1AND@EndMonth<>-1AND@BeginMonth=@EndMonth
SET@Time=','''+CAST(@BeginYearASNVARCHAR(8))+'年'+CAST(@BeginMonthASNVARCHAR(8))+'月''AS[Time]'
--如果年和月为时间条件,并且开始年与结束年相等或者开始年与结束年不相等,开始月与结束月不相等
IF@BeginYear<>-1AND@EndYear<>-1AND@BeginMonth<>-1AND@EndMonth<>-1
AND((@BeginYear=@EndYearAND@BeginMonth<>@EndMonth)OR(@BeginYear<>@EndYearAND@BeginMonth<>@EndMonth))
SET@Time=','''+CAST(@BeginYearASNVARCHAR(8))+'年'+CAST(@BeginMonthASNVARCHAR(8))+'月-'+
CAST(@EndYearASNVARCHAR(8))+'年'+CAST(@EndMonthASNVARCHAR(8))+'月''AS[Time]'
SET@Field=@Field+@Time
SET@Where='WHERE1=1'
--如果时间类型不为按时间范围查询
IF@TimeType<>'Area'
SET@Where=@Where+'ANDTimeType='''+@TimeType+''''
--如果StatType不为空
IF@StatType<>''AND@StatTypeISNOTNULL
SET@Where=@Where+'ANDStatType='''+@StatType+''''
--如果CPCode不为空
IF@CPCode<>''AND@CPCodeISNOTNULL
SET@Where=@Where+'ANDCPCode='''+@CPCode+''''
--如果CPName不为空
IF@CPName<>''AND@CPNameISNOTNULL
SET@Where=@Where+'ANDCPNameLIKE''%'+@CPName+'%'''
--如果ProductCode不为空
IF@ProductCode<>''AND@ProductCodeISNOTNULL
SET@Where=@Where+'ANDProductCode='''+@ProductCode+''''
--如果ProductName不为空
IF@ProductName<>''AND@ProductNameISNOTNULL
SET@Where=@Where+'ANDProductName=''%'+@ProductName+'%'''
IF@BeginYear<>-1AND@EndYear<>-1
SET@Where=@Where+'AND((Year>='+CAST(@BeginYearASNVARCHAR(8))+
'ANDYEAR<='+CAST(@EndYearASNVARCHAR(8))+')'
IF@BeginMonth<>-1AND@EndMonth<>-1
SET@Where=@Where+'OR(Month>='+CAST(@BeginMonthASNVARCHAR(8))+
'ANDMonth<='+CAST(@EndMonthASNVARCHAR(8))+')'
IF@BeginYear<>-1AND@EndYear<>-1
SET@Where=@Where+')'
SET@Group='GROUPBY'
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+'FROMUserOrderStat'+@Where+@Group
EXECUTE('SELECT'+@Field+'FROMUserOrderStat'+@Where+@Group)
END
GO
数据访问类:
UserOrderStatDAL.cs
在这里用到了企业库进行数据库操作
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Data;
usingSystem.Data.Common;
usingMicrosoft.Practices.EnterpriseLibrary.Data;
namespaceDAL
{
publicpartialclassUserOrderStatDAL
{
///
///获取用户订购统计分析数据
///
///统计类型:
CP-按CP统计,Product-按产品统计
///时间类型:
Year-按年统计,Month-按月统计,Area-按时间范围统计
///