2009-10-02 2 views
0

У меня есть временная таблица, давайте назовем это #invoices, определяются какКак обновить текущий баланс одним выстрелом?

create table (id int identity(1, 1), billed money, credited money, balance money) 

У меня есть следующие данные в нем

Billed Credited 
140.00 
20.00 
      60.00 
      20.00 
     -20.00 

Я хотел бы обновить баланс колонки при работающем баланс. так что столбец «Баланс» обновляется должным образом. Баланс в основном, выставлен счет - кредит, но он должен принять в счет предыдущей строки.

Так в моем примере, баланс будет так:

Billed Credited Balance 
140.00    140.00 
20.00    160.00 
      60.00  100.00 
      20.00  80.00 
     -20.00 -100.00 

Есть ли способ сделать это без пробегаем по строкам и сохраняя текущий остаток? В основном я ищу, чтобы обновить столбец «Баланс» на основе набора.

ответ

3

основанные на использовании способы расчета текущих итогов на SQL Server, однако в текущих версиях SQL Server решение на основе курсора часто бывает быстрее.

Adam Machanic написал отличную статью об этом here.

+0

На самом деле решение, которое я ищу, находится в указанной вами ссылке - 1 комментарий Денниса Аллена. – AngryHacker

-1

Ответ - триггеры. Я использую их, и он работает красиво. У меня нет точно вашей установки (это немного странно, если можно так выразиться), но в целом, они здесь правильный подход. Вам нужно будет помнить о заказе, но кроме этого, все должно быть хорошо.

+0

Примечание для людей, читающих: если кто-то не дает веских оснований для этого downvote, важно отметить, что я не ошибаюсь. Триггеры намного лучше, чем курсоры для этой цели, а поддержание баланса для каждой транзакции - немного странно , –

+0

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

+0

Я не заметил, что это был темп; вы делаете это с помощью триггеров, чтобы вы всегда его обновляли. Затем, когда вы хотите запустить запрос по заданному диапазону, вы просто делаете это (потому что у вас есть исторические данные). Ваш подход затрудняет, скажем, вставить новую строку (она будет для общего пересчета) в данной точке. –

Смежные вопросы