Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.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
Sql server select语句中的条件和_Sql Server - Fatal编程技术网

Sql server select语句中的条件和

Sql server select语句中的条件和,sql-server,Sql Server,我试图在select语句表中进行条件求和,但我想不出这样做的方法 总和应持续进行,直到它达到表中的重置标志 当按下重置标志(1)时,需要将增量值设置为0,并且应该从下一行开始再次求和 请看一下我想从我的大表中选择的数据结构 ID Value ValueIncrement ResetFlag 1 2 2 0 2 3 5 (2+3)

我试图在select语句表中进行条件求和,但我想不出这样做的方法

总和应持续进行,直到它达到表中的重置标志

当按下重置标志(1)时,需要将增量值设置为0,并且应该从下一行开始再次求和

请看一下我想从我的大表中选择的数据结构

ID  Value  ValueIncrement                   ResetFlag
1     2          2                              0   
2     3          5  (2+3)                       0
3     9          14 (2+3+9)                     0   
4     6          20 (2+3+9+6)                   0
5     3          23 (2+3+9+6+3)                 0
6     1          24 (2+3+9+6+3+1)               0
7     2          26 (2+3+9+6+3+1+2)             0
8     0          26 (2+3+9+6+3+1+2+0)           0
9     2          30 (2+3+9+6+3+1+2+0+2)         1
10    4          4                              0   
11    5          9 (4+5)                        0
12    3          12 (4+5+3)                     0   
13    6          18 (4+5+3+6)                   0
14    7          25(4+5+3+6+7)                  0
15    4          29(4+5+3+6+7+4)                0
16    7          36(4+5+3+6+7+4+7)              0
17    9          ‭45‬(4+5+3+6+7+4+7+9)          0   
18    2          47(4+5+3+6+7+4+7+9+2)          0
19    1          48(4+5+3+6+7+4+7+9+2+1)        0
20    1          49(4+5+3+6+7+4+7+9+2+1+1)      1

我尝试了一些事情,但我无法让它以我需要的方式工作,任何帮助或建议将不胜感激

一种可能的解决方案,使用窗口函数:

表:

CREATE TABLE Data (
    ID int,  
    [Value] int,
    ResetFlag int,
)
INSERT INTO Data 
    (ID, [Value], ResetFlag)
VALUES
    (1 , 2, 0),   
    (2 , 3, 0),
    (3 , 9, 0),   
    (4 , 6, 0),
    (5 , 3, 0),
    (6 , 1, 0),
    (7 , 2, 0),
    (8 , 0, 0),
    (9 , 2, 1),
    (10, 4, 0),   
    (11, 5, 0),
    (12, 3, 0),   
    (13, 6, 0),
    (14, 7, 0),
    (15, 4, 0),
    (16, 7, 0),
    (17, 9, 0),   
    (18, 2, 0),
    (19, 1, 0),
    (20, 1, 1)
声明:

;WITH GroupsCTE AS (
    SELECT 
        ID, [Value], ResetFlag,
        CASE WHEN LAG(ResetFlag) OVER (ORDER BY ID) = 1 THEN 1 ELSE 0 END AS NewGroup
    FROM Data
), FinalCTE AS (
    SELECT 
        ID, [Value], ResetFlag,
        SUM(NewGroup) OVER (ORDER BY ID) AS GroupID
    FROM GroupsCTE
)
SELECT 
    ID, [Value], ResetFlag, SUM([Value]) OVER (PARTITION BY GroupID ORDER BY ID) AS ValueIncrement
FROM FinalCTE
结果:

--------------------------------------
ID  Value   ResetFlag   ValueIncrement
--------------------------------------
1   2       0           2
2   3       0           5
3   9       0           14
4   6       0           20
5   3       0           23
6   1       0           24
7   2       0           26
8   0       0           26
9   2       1           28
10  4       0           4
11  5       0           9
12  3       0           12
13  6       0           18
14  7       0           25
15  4       0           29
16  7       0           36
17  9       0           45
18  2       0           47
19  1       0           48
20  1       1           49

你说你试过了,有什么不管用的?你的尝试是什么?(显示您的代码。)这看起来不像是一个有条件的
SUM
,而是一个累积的
SUM
。我在select中尝试了SUM(Col1)Over(order by id)作为输出,但它贯穿了整个数据集,这不是我所需要的,我尝试在重设标志被点击时解剖数据集的块,以便它开始为下一个卡盘重新求和。我已经创建了while循环和临时表,但我并没有把所有代码都放在简单的地方。请确认预期结果(第17、18、19、20行)中的值好吗?Zhorov,感谢您的帮助,表分区工作得很好,它确实很好地解析了数据集,并在进行过程中对其进行了总结。再次感谢您的时间和努力。