统计套表模板统计分析报表解决方案精编.docx
《统计套表模板统计分析报表解决方案精编.docx》由会员分享,可在线阅读,更多相关《统计套表模板统计分析报表解决方案精编.docx(18页珍藏版)》请在冰豆网上搜索。
统计套表模板统计分析报表解决方案精编
{统计套表模板}统计分析报表解决方案
.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*FROMWHEREobject_id=OBJECT_ID(N'[dbo].[SP_UserOrderStatByYear]')ANDtypein(N'P',N'PC'))
DROPPROCEDURE[dbo].[SP_UserOrderStatByYear]
GO
--按年统计用户订购
CREATEPROCEDURESP_UserOrderStatByYear
@BeginYearINT,--开始年份
@EndYearINT--结束年份
AS
BEGIN
(16)
(16)
=@BeginYear
=@EndYear+1
--判断结束年份是否为当前时间年份或大于当前时间年份
>=YEAR(GETDATE())
=YEAR(GETDATE())
=CAST(@Temp_BeginYearASNVARCHAR(8))+'-1-1'
=CAST(@Temp_EndYearASNVARCHAR(8))+'-1-1'
--添加年统计数据
INSERTINTOUserOrderStat
(
StatType,
TimeType,
[Year],
CPCode,
CPChName,
ProductCode,
ProductName,
OrderCount
)
--按CP公司统计
SELECT'CP','Year',YEAR(),,MAX(c.CPChName),'','',COUNT(0)
FROMUserOrderInfouoiJOINCPInfocON=c.CPCode
JOINProductInfopON=p.ProductCode
WHERE=1AND>@BeginTimeAND<@EndTime
ANDNOTEXISTS(SELECT0FROMUserOrderStatuosWHERE=AND=YEAR())
GROUPBY,YEAR()
UNION
--按产品统计
SELECT'Product','Year',YEAR(),MAX(),MAX(c.CPChName),,MAX(p.ProductName),COUNT(0)
FROMUserOrderInfouoiJOINCPInfocON=c.CPCode
JOINProductInfopON=p.ProductCode
WHERE=1AND>@BeginTimeAND<@EndTime
ANDNOTEXISTS(SELECT0FROMUserOrderStatuosWHERE=
AND=AND=YEAR())
GROUPBY,YEAR()
END
GO
按月统计存储过程:
IFEXISTS(SELECT*FROMWHEREobject_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
(16)
(16)
=@BeginYear
=@BeginMonth
=@EndYear
=@EndMonth+1
--判断结束年份是否大于当前时间年份,当前月份是否为1月或者判断结束年份是否等于当前时间年份,结束月份是否大于当前时间月份
>YEAR(GETDATE())OR(@EndYear=YEAR(GETDATE())>MONTH(GETDATE()))
BEGIN
=YEAR(GETDATE())
=MONTH(GETDATE())
END
=CAST(@Temp_BeginYearASNVARCHAR(8))+'-'+CAST(@BeginMonthASNVARCHAR(8))+'-1'
=CAST(@Temp_EndYearASNVARCHAR(8))+'-'+CAST(@EndMonthASNVARCHAR(8))+'-1'
--添加月统计数据
INSERTINTOUserOrderStat
(
StatType,
TimeType,
[Year],
[Month],
CPCode,
CPChName,
ProductCode,
ProductName,
OrderCount
)
--按CP公司统计
SELECT'CP','Month',YEAR(),MONTH(),,MAX(c.CPChName),'','',COUNT(0)
FROMUserOrderInfouoiJOINCPInfocON=c.CPCode
JOINProductInfopON=p.ProductCode
WHERE=1AND>@BeginTimeAND<@EndTime
ANDNOTEXISTS(SELECT0FROMUserOrderStatuosWHERE=
AND=YEAR()AND=MONTH())
GROUPBY,YEAR(),MONTH()
UNION
--按产品统计
SELECT'Product','Month',YEAR(),MONTH(),MAX(),MAX(c.CPChName),,MAX(p.ProductName),COUNT(0)
FROMUserOrderInfouoiJOINCPInfocON=c.CPCode
JOINProductInfopON=p.ProductCode
WHERE=1AND>@BeginTimeAND<@EndTime
ANDNOTEXISTS(SELECT0FROMUserOrderStatuosWHERE=
AND=AND=YEAR()AND=MONTH())
GROUPBY,YEAR(),MONTH()
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
--查询字段
(512)
--查询条件
(512)
--按范围查询时间字段
(256)
--分组
(256)
--排序
(256)
--设置查询字段
=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'
=''
--如果时间条件都未选择,则查询总时间段
====-1
=',''总时间段''AS[Time]'
--如果年为时间条件,并且开始年与结束年相等
<><>=@==-1
=','''+CAST(@BeginYearASNVARCHAR(8))+'年''AS[Time]'
--如果年为时间条件,并且开始年与结束年不相等
<><><>@==-1
=','''+CAST(@BeginYearASNVARCHAR(8))+'年-'+CAST(@EndYearASNVARCHAR(8))+'年''AS[Time]'
--如果年和月为时间条件,并且开始年与结束年相等,开始月与结束月相等
<><>=@EndYear
<><>=@EndMonth
=','''+CAST(@BeginYearASNVARCHAR(8))+'年'+CAST(@BeginMonthASNVARCHAR(8))+'月''AS[Time]'
--如果年和月为时间条件,并且开始年与结束年相等或者开始年与结束年不相等,开始月与结束月不相等
<><><><>-1
AND((@BeginYear=@<>@EndMonth)OR(@BeginYear<>@<>@EndMonth))
=','''+CAST(@BeginYearASNVARCHAR(8))+'年'+CAST(@BeginMonthASNVARCHAR(8))+'月-'+
CAST(@EndYearASNVARCHAR(8))+'年'+CAST(@EndMonthASNVARCHAR(8))+'月''AS[Time]'
=@Field+@Time
='WHERE1=1'
--如果时间类型不为按时间范围查询
<>'Area'
=@Where+'ANDTimeType='''+@TimeType+''''
--如果StatType不为空
<>''
=@Where+'ANDStatType='''+@StatType+''''
--如果CPCode不为空
<>''
=@Where+'ANDCPCode='''+@CPCode+''''
--如果CPName不为空
<>''
=@Where+'ANDCPNameLIKE''%'+@CPName+'%'''
--如果ProductCode不为空
<>''
=@Where+'ANDProductCode='''+@ProductCode+''''
--如果ProductName不为空
<>''
=@Where+'ANDProductName=''%'+@ProductName+'%'''
<><>-1
=@Where+'AND((Year>='+CAST(@BeginYearASNVARCHAR(8))+
'ANDYEAR<='+CAST(@EndYearASNVARCHAR(8))+')'
<><>-1
=@Where+'OR(Month>='+CAST(@BeginMonthASNVARCHAR(8))+
'ANDMonth<='+CAST(@EndMonthASNVARCHAR(8))+')'
<><>-1
=@Where+')'
='GROUPBY'
='CP'
=@Group+'CPCode'
='Product'
=@Group+'ProductCode'
='Year'
=@Group+',Year'
='Month'
=@Group+',Month'
PRINT'SELECT'+@Field+'FROMUserOrderStat'+@Where+@Group
EXECUTE('SELECT'+@Field+'FROMUserOrderStat'+@Where+@Group)
END
GO
数据访问类:
在这里用到了企业库进行数据库操作
usingSystem;
using.Generic;
using;
using;
using;
using.Common;
using.;
namespaceDAL
{
publicpartialclassUserOrderStatDAL
{
///
///获取用户订购统计分析数据
///
///统计类型:
CP-按CP统计,Product-按产品统计
///时间类型:
Year-按年统计,Month-按月统计,Area-按时间范围统计
///统计开始年份
///统计结束年份
///统计开始月份
///统计结束月份
///CP编码
///CP名称
///产品编码
///产品名称
///
publicstaticDataSetGetUserOrderStatData(stringstatType,stringtimeType,intbeginYear,intendYear,
intbeginMonth,intendMonth,stringcpCode,stringcpName,stringproductCode,stringproductName)
{
//创建Database对象
Databasedb=("ReportDBConnection");
//创建DbCommand对象
DbCommanddbCommand=("SP_UserOrderStatQuery");
//添加输入输出参数
(dbCommand,"@StatType",,statType);
(dbCommand,"@TimeType",,timeType);
(dbCommand,"@BeginYear",32,beginYear);
(dbCommand,"@EndYear",32,endYear);
(dbCommand,"@BeginMonth",32,beginMonth);
(dbCommand,"@EndMonth",32,endMonth);
(dbCommand,"@CPCode",,cpCode);
(dbCommand,"@CPName",,cpName);
(dbCommand,"@ProductCode",,productCode);
(dbCommand,"@ProductName",,productName);
return(dbCommand);
}
}
}
业务逻辑层:
usingSystem;
using.Generic;
using;
using;
usingDAL;
using;
namespaceBLL
{
publicclassUserOrderStatBLL
{
///
///获取用户订购统计分析数据
///
///统计类型:
CP-按CP统计,Product-按产品统计
///时间类型:
Year-按年统计,Month-按月统计,Area-按时间范围统计
///统计开始年份
///统计结束年份
///统计开始月份
///统计结束月份
///CP编码
///CP名称
///产品编码
///产品名称
///
publicstaticDataSetGetUserOrderStatData(stringstatType,stringtimeType,intbeginYear,intendYear,
intbeginMonth,intendMonth,stringcpCode,stringcpName,stringproductCode,stringproductName)
{
try
{
//调用DAL层方法
return(statType,timeType,beginYear,endYear,beginMonth,endMonth,cpCode,cpName,productCode,productName);
}
catch(Exceptionex)
{
//在此处记录异常日志,并抛出异常
throwex;
}
}
}
}
在这个例子里,这一层没有起到任何作用,但是在实际的系统里这一层是必须的。
6.新建数据集:
在UI层中新建一个数据集
在数据集中添加一个DataTable
7.新建报表文件:
在本例子中使用rdlc报表
报表文件新建后,从工具栏中拖一个饼状图到设计器
然后从网站数据源中将相应字段拖到饼状图中,如下:
数据字段放置报表统计字段,类别字段决定报表统计字段按什么进行分类,而序列字段是在分类的基础上再进行细分。
在这例子里只演示按CP统计用户订购量,所以只需要将订购量拖到数据字段,将CP编码或CP名称拖到类别字段便可。
可以为报表添加输入参数,在报表菜单下报表参数内进行添加,在本例子中我添加了一个title参数和一个bottom参数。
到此一个报表文件便设计完成。
8.新建报表展示页面:
<%@PageLanguage="C#"AutoEventWireup="true"CodeBehind=".cs"
Inherits=""%>
<%@RegisterAssembly=".WebForms,Version=9.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a"
Namespace=".WebForms"TagPrefix="rsweb"%>
DOCTYPEPUBLIC"-//DTDXHTML1.0Transitional//EN""x1x1-">
ReportViewerID="rptView"runat="server"SizeToReportContent="true"Height="500px"
Width="100%"BackColor="Linen">
ReportViewer>
>
在页面上我只放了一个ReportViewer控件,大家在做例子的时候可以加上条件输入控件。
.cs
usingSystem;
using.Generic;
using;
using;
using.UI;
using.;
using.WebForms;
usingBLL;
using;
namespaceUserOrderReportPortal
{
publicpartialclassUserOrderStat:
.
{
protectedvoidPage_Load(objectsender,EventArgse)
{
if(!
IsPostBack)
{
//设置报表参数值
ReportParameter[]parameters=newReportParameter[2];
parameters[0]=newReportParameter("bottom","Terence");
parameters[1]=newReportParameter("title","用户订购统计报表");
//调用业务逻辑层方法获取数据
DataSetds=("CP","Year",2006,2009,-1,-1,"","","","");
//设置报表路径
.ReportPath="RdlcFile\\UserOrderStat_CP_";
.();
//绑