【发布时间】:2014-08-23 14:36:53
【问题描述】:
我有一个表格(TableA),有点像这样:
Id Type TimeBlock Value
1 1 1 100
2 1 1 150
3 2 1 100
4 1 1 1000
5 1 1 100
6 1 2 50
6 1 2 50
我希望能够采用 TimeBlock 对它进行分区的 Value 列的 SUM,但是我只想根据某些条件将行划分为 SUM。如果当前总和值,则条件是仅SUM 行
大于或等于 Value 列
我假设查询将以以下内容开头:
DECLARE @Amount int = 500;
SELECT *, @Amount - SUM (Value) OVER (PARTITION BY TimeBlock ORDER BY Id) AS Sum
FROM TableA
我希望结果如下所示:
Id Type TimeBlock Value Sum
1 1 1 100 400 (500 - 100)
2 1 1 150 250 (400 - 150)
3 2 1 1000 NULL (This does not count since its of type = 2 and 250 < 1000)
4 1 1 1000 0 (250 - 1000 = -750 there its filled the @Amount so we'll leave it at 0)
5 1 1 100 NULL (Since @Amount has been filled anything that comes after in this time block is NULL)
6 1 2 50 450 (500 - 50)
6 1 2 50 400 (450 - 50)
如您所见,我需要能够获取 SUM 函数的当前值,以便能够将其与我不太确定该怎么做的 Value 列进行比较。我希望能够做类似的事情
DECLARE @Amount int = 500;
SELECT *, @Amount - SUM (CASE WHEN Type = 2 AND SUM(Value) OVER (PARTITION BY TimeBlock ORDER BY Id) < Value THEN 0 ELSE Value END) OVER (PARTITION BY TimeBlock ORDER BY Id) AS Sum
FROM TableA
编辑 Type = 1 - 无论如何都要对 Value 列求和 Type = 2 - 如果当前总和值大于或等于 Value,则仅对行中的 Value 列求和
【问题讨论】:
-
你能更好地阐明规则吗?
type和什么有什么关系? -
@GordonLinoff - 请查看我的编辑
-
我认为 type = 2 的问题提出了一个使用累积和无法轻易解决的问题。光标是一种选择;另一个是递归 CTE(它也将迭代)。当您有多个 type = 2 时会出现问题 - 是否包含第二个不是一个简单的公式,这取决于是否包含第一个。
标签: sql sql-server-2012