SQLserver中while循环的操作方法,将day表的参数累加到sum表
原创因为在保险行业工作,在做统计的时候,会遇到随着年度累计数据的落差,日积月累的情况。sum桌子。如果涉及公司机密,则不会显示实际的表格结构和数据。我将重新创建一些测试表来解释while循环的魔力,day的数据sum表中。
1.数据表的编制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
查询结果,如下图所示:
3.将开始。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表中数据的累积:
版权声明
所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除