Я думаю, что используемая вами логика также нуждается в пересмотре.Столбец annual_calls
- обновляется ли он раз в год или в конце каждого месяца?Причина, по которой я спрашиваю, заключается в том, что если бы это было для новой системы с вызовами на 6 месяцев, в поле monthly_calls
было бы установлено значение примерно вдвое меньше, чем должно быть.
Я бы также предложилпереименуйте monthly_calls
в avg_monthly_calls
или что-то более значимое, потому что, если кто-то придет, посмотрите на схему вашей базы данных и попытайтесь выяснить, что к чему, они могут подумать, что в этом поле содержатся общие ежемесячные вызовы или ожидаемые ежемесячные вызовы.
Что касается оператора для обновления данных - без просмотра каких-либо данных, вот более аккуратный способ использования оператора UPDATE
без подвыборов:
UPDATE
Tab2
SET
monthly_calls = MAX(annual_calls) / 12
FROM
CPO INNER JOIN Tab2 ON CPO.accountid = Tab2.accountid
WHERE
YEAR([Tab2.DateField]) = @YearToUpdate
GROUP BY
CPO.accountid
Это в основном заботится о подвыборкевключив предложение FROM
в оператор UPDATE
.Таким образом, вы можете присоединиться и обновлять все сразу.
Редактировать: Я бы также добавил предложение WHERE
, чтобы вы могли установить его так, чтобы вы обновляли только текущий год, или предыдущий год, или любой другой год/ период, в который вы проходите. Таким образом, вы гарантируете, что получаете только одну запись для каждой учетной записи за каждый год.