SQLserver中while循环的操作方法,将day表的参数累加到sum表

原创
小哥 3年前 (2022-11-02) 阅读数 39 #大杂烩

因为在保险行业工作,在做统计的时候,会遇到随着年度累计数据的落差,日积月累的情况。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表中数据的累积:

版权声明

所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除

热门