Sql server 2012 根据条件重置同一分区中的运行总数

Sql server 2012 根据条件重置同一分区中的运行总数,sql-server-2012,sum,Sql Server 2012,Sum,今天,使用sum可以很容易地在组上运行总计 我需要根据一个条件重置同一分区中的总计,如果某行中的某个字段为false,则应重置总和并从此行开始。 在代码中,这非常简单,只需在行上循环并检查条件。但是我们如何在SQL中实现这一点呢 下面是一个示例,它包含一个包含四个字段的表,以及一个对运行金额求和的查询。如果ResetSum字段为true,则应重置总和 CREATE TABLE dbo.Table_1 ( PersonID int NOT NULL, Amount money NOT NULL,

今天,使用sum可以很容易地在组上运行总计

我需要根据一个条件重置同一分区中的总计,如果某行中的某个字段为false,则应重置总和并从此行开始。 在代码中,这非常简单,只需在行上循环并检查条件。但是我们如何在SQL中实现这一点呢

下面是一个示例,它包含一个包含四个字段的表,以及一个对运行金额求和的查询。如果ResetSum字段为true,则应重置总和

CREATE TABLE dbo.Table_1
(
PersonID int NOT NULL,
Amount money NOT NULL,
PayDate date NOT NULL,
ResetSum bit NOT NULL
)

INSERT INTO Table_1 (PersonID, Amount, PayDate, ResetSum) 
VALUES  (1, 100, '2015-1-1', 0)
,(1,200,'2015-1-2',0)
,(1,180,'2015-1-3',0)
,(1,200,'2015-1-4',1)
,(1,200,'2015-1-5',0)
,(1,360,'2015-1-6',0)

SELECT *,SUM(Amount) over(PARTITION BY PersonID ORDER BY PayDate) as SumAmount
FROM Table_1 
期望的结果应该是760,而不是1140

不能按ResetSum字段对记录进行分组,因为如果为true,则应重置此字段下方的所有字段,尽管此行中的ResetSum字段为false

下面是我的.net代码示例,非常简单:

    Public Function SumTest() As Decimal
    Dim lst As New List(Of TestRecords)
    Dim sum As Decimal = 0
    For Each tst As TestRecords In lst
        If tst.ResetSum = true Then
            sum = fcf.Amount
        Else
            sum += fcf.Amount
        End If
    Next
    Return sum
End Function

对派生表中的
ResetSum
执行运行总计,并将其用作
Amount
上运行总计的分区列

select T.PersonID,
       T.Amount,
       T.PayDate,
       sum(T.Amount) over(partition by T.PersonID, T.ResetSum 
                          order by T.PayDate rows unbounded preceding) as SumAmount
from (
     select T1.PersonID,
            T1.Amount,
            T1.PayDate,
            sum(case T1.ResetSum 
                  when 1 then 1 
                  else 0 
                end) over(partition by T1.PersonID 
                          order by T1.PayDate rows unbounded preceding) as ResetSum
     from dbo.Table_1 as T1
     ) as T;

请发布您尝试过的代码。好主意。但是没有子查询就没有更直接的方法了吗?@IFink看看你得到的执行计划。它尽可能笔直。您可能可以使用递归CTE来实现,但我认为您不会发现该版本更简单。您是对的,这是一种简单的方法。我的问题更多的是希望ssms在over条款中添加这样一个选项。我接受你的回答。