Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
while循环Sql逻辑_Sql_Sql Server 2008_While Loop - Fatal编程技术网

while循环Sql逻辑

while循环Sql逻辑,sql,sql-server-2008,while-loop,Sql,Sql Server 2008,While Loop,输入 date | username | program | workflow | Pending_Audits |Audits_Carry_Forward 31-07-2018 | ram | Pre pay | Sisi | -1 | -12 27-07-2018 | ram | Pre pay | Sisi | -111 |

输入

 date        |  username |    program | workflow  | Pending_Audits  |Audits_Carry_Forward

 31-07-2018  |  ram      |   Pre pay  | Sisi      |      -1         |      -12 
 27-07-2018  |  ram      |   Pre pay  | Sisi      |      -111       |       0
 25-07-2018  |  ram      |   Pre pay  | Sisi      |      -16        |     -14
我有上表,我正在写一个while条件,从给定日期更新审计结转列

逻辑是将给定日期的审核结转更新到下一行待定审核列,该列与给定日期具有相同的程序和工作流

所需输出:

 date        |  username |    program | workflow  | Pending_Audits  |Audits_Carry_Forward

 31-07-2018  |  ram      |   Pre pay  | Sisi      |      -1         |      -111 
 27-07-2018  |  ram      |   Pre pay  | Sisi      |      -111       |      -16
 25-07-2018  |  ram      |   Pre pay  | Sisi      |      -16        |      -14
因此,在这种情况下,我想将“2018年7月25日”的未决审计数据更新为高于给定日期的审计结转数据

我尝试的sql逻辑

DECLARE @date DATE = '2018-07-25' 
DECLARE @username VARCHAR(100)= 'ram' 
DECLARE @program VARCHAR(100)= 'Pre pay' 
DECLARE @workflow VARCHAR(100)= 'Sisi' 
DECLARE @a INT 

WHILE ( @date <= Cast(Getdate() AS DATE) ) 
  BEGIN 
      SET @a = (SELECT Count(*) 
                FROM   dbo.homehealthpp1 
                WHERE  username = @username 
                       AND program = @program 
                       AND workflow = @workflow 
                       AND date = @date) 

      IF ( @a = 1 ) 
        BEGIN 
            UPDATE dbo.homehealthpp1 
            SET    audits_carry_forward = (SELECT pending_audits 
                                           FROM   dbo.homehealthpp1 
                                           WHERE  username = @username 
                                                  AND program = @program 
                                                  AND workflow = @workflow 
                                                  AND date = @date) 
            WHERE  username = @username 
                   AND program = @program 
                   AND workflow = @workflow 
                   AND date = Cast(Dateadd(d, 1, @date) AS DATE) 
        END 

      SET @date = Cast(Dateadd(d, 1, @date) AS DATE) 
  END 
DECLARE@date日期='2018-07-25'
声明@username VARCHAR(100)='ram'
声明@program VARCHAR(100)=“预付费”
声明@workflow VARCHAR(100)='Sisi'
声明@a INT

虽然(@date假设
用户名/工作流/程序
是常用值,但您可以这样做

我们在
用户名/工作流/程序
上添加一个
行编号()
分区,然后我们可以更新
审核结转
值,以便从集合(-1)中的下一行(
rn
)找到匹配的
用户名/工作流/程序
),但仅当该行(
rn
)不是1时

DECLARE @Test TABLE ([date] DATE, username VARCHAR(100), program VARCHAR(10), workflow VARCHAR(10), pending_audits INT, audits_carry_forward INT)

INSERT INTO @Test
VALUES ('2018-07-31','ram','Pre pay','Sisi',-1,-12),
       ('2018-07-27','ram','Pre pay','Sisi',-111,0),
       ('2018-07-25','ram','Pre pay','Sisi',-16,-14)

;WITH x AS
(
    SELECT *, ROW_NUMBER() OVER(PARTITION BY username,program,workflow ORDER BY [date]) AS RN
    FROM @Test
)

UPDATE T1 SET audits_carry_forward = (SELECT pending_audits FROM X T2 WHERE T1.username=T2.username AND T1.program=T2.program AND T1.workflow=T2.workflow AND T2.RN=T1.RN-1)
FROM X T1
WHERE T1.RN!=1

SELECT *
FROM @Test
ORDER BY [date] DESC

值得注意的是,在SQL中不建议使用循环/游标。这被称为RBAR(逐行计算)方法,而且与基于集合的方法相比,所有数据都是同时更新的,资源成本要高得多。随着时间和经验的推移,您会发现大多数(尽管不是全部)方法无需使用循环/光标即可完成任务。

我不明白。我知道最近两个日期的更新方式,但不知道2018-07-25。@GordonLinoff关于“2018-07-25”的插入数据。我想从该数据更新下一个最近的日期数据。