NET统计分析报表解决方案
- 格式:docx
- 大小:950.57 KB
- 文档页数:20
.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. 统计分析存储过程建立:
按年统计存储过程:
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 --结束年份
AS
BEGIN 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_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.CPCode
JOIN ProductInfo p ON uoi.ProductCode = p.ProductCode
WHERE uoi.Status = 1 AND uoi.OrderTime > @BeginTime AND uoi.OrderTime < @EndTime
AND NOT EXISTS (SELECT 0 FROM 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.CPCode
JOIN ProductInfo p ON uoi.ProductCode = p.ProductCode
WHERE uoi.Status = 1 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))
GROUP BY uoi.ProductCode, YEAR(uoi.OrderTime) END
GO
按月统计存储过程:
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 --结束月份
AS
BEGIN
DECLARE @Temp_BeginYear INT
DECLARE @Temp_BeginMonth INT
DECLARE @Temp_EndYear INT
DECLARE @Temp_EndMonth INT
DECLARE @BeginTime NVARCHAR(16)
DECLARE @EndTime NVARCHAR(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_BeginYear AS NVARCHAR(8)) + '-' + CAST(@BeginMonth
AS NVARCHAR(8)) + '-1'
SET @EndTime = CAST(@Temp_EndYear AS NVARCHAR(8)) + '-' + CAST(@EndMonth AS
NVARCHAR(8)) + '-1'
--添加月统计数据