SQL server 中while循环的使用方法,将day表的数据累加到sum表

版权声明:本文为博主原创文章,未经博主允许不得转载。 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表的数据的累加:

 

猜你喜欢

转载自blog.csdn.net/lanxingbudui/article/details/83511770