1. 程式人生 > >SQL server 中while迴圈的使用方法,將day表的資料累加到sum表

SQL server 中while迴圈的使用方法,將day表的資料累加到sum表

       因為在保險行業工作,在統計資料的時候會遇到將每天的資料累加起來作為年累計的資料落到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<
[email protected]
_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表的資料的累加: