前段时间接到很多报表的工作,现拿出一些小例子与大家分享。
用户需求:运营商管理员: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. 统计分析存储过程建立:按年统计存储过程:IF EXISTS (SELECT*FROM sys.objects WHERE object_id=OBJECT_ID(N'[dbo].[SP_UserOrderStatByYear]') AND type in (N'P', N'PC'))DROP PROCEDURE[dbo].[SP_UserOrderStatByYear]GO--按年统计用户订购CREATE PROCEDURE SP_UserOrderStatByYear@BeginYear INT, --开始年份@EndYear INT--结束年份ASBEGINDECLARE@Temp_BeginYear INTDECLARE@Temp_EndYear INTDECLARE@BeginTime NVARCHAR(16)DECLARE@EndTime NVARCHAR(16)SET@Temp_BeginYear=@BeginYearSET@Temp_EndYear=@EndYear+1--判断结束年份是否为当前时间年份或大于当前时间年份IF@EndYear>=YEAR(GETDATE())SET@Temp_EndYear=YEAR(GETDATE())SET@BeginTime=CAST(@Temp_BeginYear 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 UserOrderInfo uoi JOIN CPInfo c ON uoi.CPCode = c.CPCodeJOIN ProductInfo p ON uoi.ProductCode = p.ProductCodeWHERE uoi.Status =1AND uoi.OrderTime >@BeginTime AND uoi.OrderTime <@EndTime AND NOT EXISTS (SELECT0FROM UserOrderStat uos WHERE uos.CPCode = uoi.CPCode AND uos.Year=YEAR(uoi.OrderTime))GROUP BY uoi.CPCode, YEAR(uoi.OrderTime)UNION--按产品统计SELECT'Product', 'Year', YEAR(uoi.OrderTime), MAX(uoi.CPCode),MAX(c.CPChName), uoi.ProductCode, MAX(p.ProductName), COUNT(0)FROM UserOrderInfo uoi JOIN CPInfo c ON uoi.CPCode = c.CPCodeJOIN ProductInfo p ON uoi.ProductCode = p.ProductCodeWHERE uoi.Status =1AND uoi.OrderTime >@BeginTime AND uoi.OrderTime <@EndTime AND NOT EXISTS (SELECT0FROM UserOrderStat uos WHERE uos.CPCode = uoi.CPCode AND uos.ProductCode = uoi.ProductCode AND uos.Year=YEAR(uoi.OrderTime))GROUP BY uoi.ProductCode, YEAR(uoi.OrderTime)ENDGO按月统计存储过程:IF EXISTS (SELECT*FROM sys.objects WHERE object_id=OBJECT_ID(N'[dbo].[SP_UserOrderStatByMonth]') AND type in (N'P', N'PC'))DROP PROCEDURE[dbo].[SP_UserOrderStatByMonth]GO--按月统计用户订购CREATE PROCEDURE SP_UserOrderStatByMonth@BeginYear INT, --开始年份@BeginMonth INT, --开始月份@EndYear INT, --结束年份@EndMonth INT--结束月份ASBEGINDECLARE@Temp_BeginYear INTDECLARE@Temp_BeginMonth INTDECLARE@Temp_EndYear INTDECLARE@Temp_EndMonth INTDECLARE@BeginTime NVARCHAR(16)DECLARE@EndTime NVARCHAR(16)SET@Temp_BeginYear=@BeginYearSET@Temp_BeginMonth=@BeginMonthSET@Temp_EndYear=@EndYearSET@Temp_EndMonth=@EndMonth+1--判断结束年份是否大于当前时间年份,当前月份是否为1月或者判断结束年份是否等于当前时间年份,结束月份是否大于当前时间月份IF@EndYear>YEAR(GETDATE()) OR (@EndYear=YEAR(GETDATE()) AND@EndMonth> MONTH(GETDATE()))BEGINSET@Temp_EndYear=YEAR(GETDATE())SET@Temp_EndMonth=MONTH(GETDATE())ENDSET@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],[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.CPCodeJOIN ProductInfo p ON uoi.ProductCode = p.ProductCodeWHERE uoi.Status =1AND uoi.OrderTime >@BeginTime AND uoi.OrderTime <@EndTime AND NOT EXISTS (SELECT0FROM UserOrderStat uos WHERE uos.CPCode = uoi.CPCode AND uos.Year=YEAR(uoi.OrderTime) AND uos.Month=MONTH(uoi.OrderTime))GROUP BY uoi.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) FROM UserOrderInfo uoi JOIN CPInfo c ON uoi.CPCode = c.CPCodeJOIN ProductInfo p ON uoi.ProductCode = p.ProductCodeWHERE uoi.Status =1AND uoi.OrderTime >@BeginTime AND uoi.OrderTime <@EndTime AND NOT EXISTS (SELECT0FROM 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.ProductCode, YEAR(uoi.OrderTime), MONTH(uoi.OrderTime)ENDGO4. 新建数据库作业,用来定时执行年统计存储过程和月统计存储过程,一个用来执行月统计存储过程,计划为每月的1日零点执行。