根据另一个表中所有先前日期的总和更新表中的字段

时间:2011-01-27 22:07:37

标签: sql database sql-server-2005 database-design

以下是我设置的两个表的简化版本:

Users (Name(varchar), DateAdded(date))
Costs (Month(date), TotalUsers(int))

现在每当我在Users表中插入,更新或删除DateAdded时,我都想更新Costs表中的相应行。因此,如果我从2011年1月起删除users表中的一行,则Costs表中具有Date值晚于2011年1月的日期值的所有行都需要减少其TotalUsers字段。例如,在这种情况下,2011年2月和2011年3月的行将需要减少其TotalUsers,但2010年12月的行不会。

基本上每当我在Users中更改一行时,我想更改成本中的每一行,以便其TotalUsers字段表示Users表中所有日期之前的总和。我目前正在使用插入删除设置触发器,但我不确定在不使用游标的情况下更新成本表的最佳方法。

1 个答案:

答案 0 :(得分:2)

我建议你创建一个关于用户的视图,它会生成正确的月份并且每次计数

Create View dbo.VCosts
with schemabinding
AS
SELECT MONTH(DateAdded) Month, COUNT_BIG(*) TotalUsers
From dbo.Users
Group by MONTH(DateAdded)

如果您需要为performance reasons保留(存储)数据,则可以创建INDEXED VIEW以实现视图。它会自动维护,因此您无需使用触发器。

create unique clustered index cix_VCosts on VCosts(Month)

如果您的“费用”表中有其他列,请将这两列保留在外,然后按月加入此视图以获取数据。