2016-06-24 4 views
0

У меня есть журнал транзакций, и произошла транзакция в этом журнале, которая неверна.Получить значение столбца по номеру строки 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 
+1

вы можете использовать 'SUM (Цена) OVER (Сортировать по сделке)', чтобы получить нарастающим итогом и просто вычесть текущую цену от этого, чтобы получить предыдущий баланс. '(SUM (Price) OVER (Заказ по сделке) - Цена)' – JamieD77

+0

Можете ли вы сформулировать этот пример. . Я пытаюсь сказать, что вы говорите, и я получаю синтаксические ошибки. – nanthil

ответ

0

Вы можете моделировать lag функции в SQL Server 2008. Есть несколько примеров там, вот лучшая статья I нашли по этой теме.

http://blog.sqlauthority.com/2011/11/24/sql-server-solution-to-puzzle-simulate-lead-and-lag-without-using-sql-server-2012-analytic-function/

+0

Я пробовал это, и да, это работает, но не для моей конкретной проблемы, когда мне нужно хранить и выполнять манипуляции с данными. Благодарю. – nanthil