数据库表中数月的数据帮助

时间:2011-09-21 19:32:38

标签: sql sql-server tsql

我有一个记录表,如下所示

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

有什么想法吗?

4 个答案:

答案 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'这样的列名。

不要浪费表格列的总和,想象当有人更新数据库中的列时会发生什么。只需在视图中使用计算列即可。