版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lanxingbudui/article/details/83511770
因为在保险行业工作,在统计数据的时候会遇到将每天的数据累加起来作为年累计的数据落到sum表中。涉及公司的机密就不把实际的表结构和数据展示,我重新创建一些测试表来说明while循环的神奇之处,day的数据累加到sum表中。
一、准备数据表test_day_target和test_sum_target和sum表数据
create table test_day_target --日统计表
(statdate varchar(8),
branch varchar(6),
prem decimal(10,4),
stamp datetime)
create table test_sum_target --年累计表
(statdate varchar(8),
branch varchar(6),
prem decimal(10,4),
stamp datetime)
--查询表中的数据
select * from test_sum_target;
select * from test_day_target;
--在sum中插入两条数据,作为测试看看是否被替换
insert into test_sum_target(statdate,branch,prem,stamp) values ('20171201',110000,100,getdate());
insert into test_sum_target(statdate,branch,prem,stamp) values ('20171231',110000,10000,getdate());
查询结果,如下图:
二、使用while循环将day表插入几个月的数据:
USE [test]
GO
/****** Object: StoredProcedure [dbo].[proc_add_day] Script Date: 2018/10/29 17:18:10 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE procedure [dbo].[proc_add_day]
@startdate_in varchar(8),
@enddate_in varchar(8)
--exec proc_add_day '20171201','20180301'
as
begin
declare @start_date varchar(8)
declare @end_date varchar(8)
declare @prem decimal(10,4)
set @start_date = @startdate_in
set @end_date = @enddate_in
set @prem = 100
while @start_date<=@end_date
begin
IF EXISTS (SELECT 1 FROM test_day_target WHERE statdate = @start_date)
begin
delete test_day_target where statdate = @start_date
end
insert into test_day_target (statdate,branch,prem,stamp)
values (convert(varchar(8),@start_date,112),110000,@prem,getdate());
set @start_date = convert(varchar(8),dateadd(dd,1,@start_date),112)
set @prem = @prem+100
end
end
GO
查询结果,如下图:
三、开始将day的数据累加到sum表
USE [test]
GO
/****** Object: StoredProcedure [dbo].[proc_day_to_sum] Script Date: 2018/10/29 20:16:35 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
alter PROCEDURE [dbo].[proc_day_to_sum]
@start_date varchar(8), /*统计起始日期字符串,如20171120*/
@end_date varchar(8) /*统计结束日期字符串,如20180231*/
----exec dbo.proc_day_to_sum '20171220','20180301'
as
BEGIN
/****************************
author:lanxingbudui
date:20181029
des:test_day_target表数据累加插入到test_sum_target表
*****************************/
DECLARE @sdate varchar(8) --统计开始日期
DECLARE @edate varchar(8) --统计结束日期
DECLARE @stamp datetime --数据加工时间戳
DECLARE @mdate varchar(8) --结束日期当年第一天
SET @sdate = @start_date
SET @edate = @end_date
SET @stamp = GETDATE()
--如果统计期间跨年度,@mdate保存结束日期所在年份的第一天
SET @mdate = convert(varchar(8),YEAR(@edate) ,112)+'0101'
BEGIN
--从统计起始日期开始汇总,循环至统计结束日期
/*创建临时表,保留前一天的本年累计数;当天的本年累计数=前一天的本年累计数+当天发生数*/
SELECT * INTO #test_sum_target1
FROM test_sum_target WHERE 1 = 2
SELECT * INTO #test_sum_target2
FROM test_sum_target WHERE 1 = 2
/*循环开始日期, 当天的本年累计数保存在临时表 #test_sum_target1 */
INSERT INTO #test_sum_target1
(statdate,branch,prem,stamp)
SELECT @sdate,branch,sum(prem),@stamp
FROM test_day_target
WHERE statdate >= CONVERT(CHAR(4), YEAR(@sdate), 112)+ '-01-01'
AND statdate <= @sdate--从本年度的1月1日开始至起始时间的总和
GROUP BY branch
/*对年累计汇总表test_sum_target 进行先删后插*/
DELETE FROM test_sum_target WHERE statdate = @sdate
INSERT INTO test_sum_target
SELECT * FROM #test_sum_target1
--将临时表数据写入test_sum_target表完成,开始循环
--从起始日期的第二天开始,循环开始计算本年累计数,放入sum表
SET @sdate = convert(varchar(8),DATEADD(dd, 1, @sdate),112)
WHILE @sdate <= @edate
BEGIN
BEGIN
IF @sdate = @mdate
BEGIN
TRUNCATE TABLE #test_sum_target1;
END
END
/*day_to_sum*/
BEGIN
INSERT INTO #test_sum_target1
(statdate,branch,prem,stamp)
SELECT
@sdate,branch,sum(prem),@stamp
FROM test_day_target
WHERE statdate = @sdate
GROUP BY branch
TRUNCATE TABLE #test_sum_target2
INSERT INTO #test_sum_target2
(statdate,branch,prem,stamp)
SELECT @sdate,branch,sum(prem),@stamp
FROM #test_sum_target1
GROUP BY branch
/*删除###test_sum_target1表 数据,插入###test_sum_target2表的数据*/
TRUNCATE TABLE #test_sum_target1
INSERT INTO #test_sum_target1
SELECT * FROM #test_sum_target2
/*删除sum表该日数据*/
DELETE FROM test_sum_target
WHERE statdate = @sdate
INSERT INTO test_sum_target
SELECT * FROM #test_sum_target2
END
SET @sdate = convert(varchar(8),DATEADD(dd, 1, @sdate),112) /*计算日期增加一天*/
END
DROP TABLE #test_sum_target1
DROP TABLE #test_sum_target2
END
END
GO
执行结果,如下图,可以看到20171221日sum表的数据的累加: