Sql server 2012 根据条件重置同一分区中的运行总数
今天,使用sum可以很容易地在组上运行总计 我需要根据一个条件重置同一分区中的总计,如果某行中的某个字段为false,则应重置总和并从此行开始。 在代码中,这非常简单,只需在行上循环并检查条件。但是我们如何在SQL中实现这一点呢 下面是一个示例,它包含一个包含四个字段的表,以及一个对运行金额求和的查询。如果ResetSum字段为true,则应重置总和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,
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条款中添加这样一个选项。我接受你的回答。