按行号SQL Server 2008获取列值

时间:2016-06-24 18:24:28

标签: sql-server transactions

我有一个事务日志,并且此日志上的事务不正确。

transaction    Price   balance
-------------------------------
    121          50      -50
    122         100        0
    123          50      100
    124          50      250

在此示例中,transactionPrice行122的值不正确。我插入了一条记录,以便以正确的总金额将金额记入帐户,但我们的系统现在正在使整个帐户失去平衡。删除插入后,我现在需要更新所有记录以使它们正确,我有一个问题。

我试图创建一个具有正确值的文本生成器,而不是通过并手动为每个记录进行数学运算,我正在尝试使用“total”或“c​​urrentvalue”。

这是问题所在。在事务THIS之后,transactionPrice = 150.00记录balance500。在此事务之后,update NEXT transaction我需要PREVIOUS事务值。我需要获得500,以便我可以从先前的交易中减去CURRENT balance的交易价值。

650 - 150 = 500
500 - 125 = 375

如何从之前的记录中获得500分? (注意:此命令由desc命令,因此“previous”上升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 个答案:

答案 0 :(得分:0)

您可以在SQL Server 2008中模拟lag函数。这里有一些示例,这是我在该主题上找到的最佳文章。

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