У меня есть журнал транзакций, и произошла транзакция в этом журнале, которая неверна.Получить значение столбца по номеру строки SQL Server 2008
transaction Price balance
-------------------------------
121 50 -50
122 100 0
123 50 100
124 50 250
В этом примере значение transactionPrice row 122 неверно. Я вставил запись, чтобы дебетовать сумму обратно на счет с правильной суммой, но наша система теперь выводит всю учетную запись из равновесия. Удалив вставку, мне теперь нужно обновить все записи, чтобы они были правильными, и у меня есть вопрос.
Вместо того, чтобы проходить и вручную выполнять математику для каждой записи и вручную создавать операторы обновления, я пытаюсь создать текстовый генератор с правильными значениями, но у меня возникают проблемы с «итоговым» или «текущим значением», ,
Вот проблема, просто заявленная. THIS
запись transactionPrice = 150.00
и balance
после сделки 500
. ПОСЛЕ этой транзакции, update
СЛЕДУЮЩИЙ transaction
Мне нужно ПРЕДВАРИТЕЛЬНОЕ значение транзакции. Мне нужно получить 500, чтобы я мог вычесть значение транзакции из CURRENT balance
из предыдущей транзакции.
650 - 150 = 500
500 - 125 = 375
Как я могу получить 500 из предыдущей записи? (примечание: это заказы по алфавиту, так что «предыдущий» идет вверх по ROW_NUMBER()
, 129 предшествует 128, прежде чем 127 хронологически)
Я не могу использовать Lag(....)
, и я попробовал ROW_NUMBER() OVER(....)
подход, но я могу Кажется, чтобы получить фактическое содержимое строки, просто номер сам.
Пример моего заявления. Мы смотрим на SET Balance = ' + CAST(...)
SELECT
'UPDATE table
SET transactionPrice = ' + CAST(@CorrectPrice as nvarchar(50)) + ', SET Balance = ' + CAST(Balance as nvarchar(50)) + '
WHERE UsageId = ' + CAST(c.UsageId as nvarchar(50)) as 'UpdateQueriesToRun'
FROM
table
WHERE
ContractId = @ContractID
AND DateActive IN (SELECT DateActive
FROM table
WHERE ContractId = @ContractID)
ORDER BY
DateActive DESC
псевдокода версии того, что мне нужен
SELECT
'SET Balance = ' + CAST((PREVIOUS_ROW.BALANCE - @CorrectPrice) as nvarchar(50)) + '
WHERE ID = ' + CAST(ID as nvarchar(50)) as 'INSTRUCTIONS'
FROM
table
вы можете использовать 'SUM (Цена) OVER (Сортировать по сделке)', чтобы получить нарастающим итогом и просто вычесть текущую цену от этого, чтобы получить предыдущий баланс. '(SUM (Price) OVER (Заказ по сделке) - Цена)' – JamieD77
Можете ли вы сформулировать этот пример. . Я пытаюсь сказать, что вы говорите, и я получаю синтаксические ошибки. – nanthil