SQL server 中while迴圈的使用方法,將day表的資料累加到sum表
阿新 • • 發佈:2018-10-31
因為在保險行業工作,在統計資料的時候會遇到將每天的資料累加起來作為年累計的資料落到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表的資料的累加: