Обновление поля в таблице на основе суммы всех предыдущих дат в другой таблице - PullRequest
0 голосов
/ 28 января 2011

Вот упрощенная версия двух таблиц, которые я настроил следующим образом:

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

Теперь, когда я вставляю, обновляю или удаляю DateAdded в таблице Users, я хочу обновить соответствующуюстроки в таблице затрат.Поэтому, если я удаляю строку в таблице users с января 2011 года, все строки в таблице Costs, имеющие значение Date позднее января 2011 года в клоне Month, должны иметь уменьшенное поле TotalUsers.Например, в этом случае строки с февраля 2011 и марта 2011 года должны уменьшить свои TotalUsers, но строка с декабря 2010 не будет.

Обычно, когда я меняю строку в Users, я хочу изменить каждую строку в стоимости так, чтобы ее поле TotalUsers представляло сумму всех дат в таблице Users перед ее собственной.В настоящее время я использую триггер, настроенный на удаление вставки, но я не уверен, что лучший способ обновить таблицу затрат без использования курсора.

1 Ответ

2 голосов
/ 28 января 2011

Я бы посоветовал вам вместо этого создать представление о пользователях, которое будет производить правильные месяцы и каждый раз считать

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

Если вам необходимо, чтобы данные были сохранены (сохранены) по причинам производительности , вы можете создать INDEXED VIEW для материализации представления. Он поддерживается автоматически, поэтому вам не придется возиться с триггерами.

create unique clustered index cix_VCosts on VCosts(Month)

Если в таблице «Затраты» были другие столбцы, то оставьте эти два столбца незаполненными и присоединитесь к этому представлению по месяцам, чтобы получить данные.

...