【问题标题】:Updating a field in a table based on the sum of all previous dates in another table根据另一个表中所有先前日期的总和更新表中的字段
【发布时间】:2011-01-27 22:07:37
【问题描述】:

这是我这样设置的两个表的简化版本:

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

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

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

【问题讨论】:

  • SQL Server 的哪个版本?7

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


【解决方案1】:

我建议您创建一个用户视图,而不是每次生成正确的月份和计数

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)

如果您的 Costs 表中有其他列,则保留这两列并按月加入此视图以获取数据。

【讨论】:

  • 感谢您的快速回复!我试试看
猜你喜欢
  • 2019-05-20
  • 1970-01-01
  • 2020-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多