我有一个记录表,如下所示
Month Amount Sum
1 100 100
2 50 150
3 NULL NULL
4 NULL NULL
5 50 200
ETC.
如何保留一个正在运行的总和列,并且我想将之前的有效总和级联成一个SQL语句中的空记录,如下所示?
1 100 100
2 50 150
3 0 150
4 0 150
5 50 200
有什么想法吗?
答案 0 :(得分:3)
这不是您通常存储在数据库中的内容,而是获取查询。你可以在桌子上做一个子查询来得到一笔钱:
SELECT
t1.Month, t1.Amount,
SUM(SELECT t2.Amount FROM my_table t2 WHERE t2.Month <= t1.Month)
FROM my_table t1
通过这种方式,我使用了两次表格,一次用作t1
,一次用作t2
。
答案 1 :(得分:1)
假设插入的新月份和金额由变量@month
和@amount
表示:
INSERT INTO t (Month, Amount, [Sum])
SELECT @month,
CASE WHEN @amount IS NULL THEN 0 ELSE @amount END,
CASE WHEN @amount IS NULL THEN SUM(Amount) ELSE SUM(Amount) + @amount END
FROM t
如果月份总是连续的,您可以使用MAX(Month) + 1
代替@month
作为插入值。
(虽然我同意@ JHolyHead的警告,我会犹豫是否要在桌子内存放一个总计......)
答案 2 :(得分:0)
将运行总和值存储在您可以在每个事务处读取和更新的其他位置,或者在事务期间计算它的SP中执行一些聪明的逻辑。
如果我是诚实的,我不会存储它。我可能更喜欢在需要时在应用程序中计算它。这样您就可以按日期/任何其他您喜欢的标准进行过滤。
答案 3 :(得分:0)
从2005版开始
;with a as(
select month, coalesce(amount, 0) amount, row_number() over(order by /*year?,*/ month) rn
from yourtable
),
cte as
(
select month, amount, amount [sum1]
from a where rn = 1
union all
select a.month, a.amount, a.amount + b.amount
from cte join a on a.rn = cte.rn - 1
)
select month, amount, [sum1] from cte
我表示,即使是计算列,也不要使用像'sum'这样的列名。
不要浪费表格列的总和,想象当有人更新数据库中的列时会发生什么。只需在视图中使用计算列即可。