减去两列(Col1-Col2)并将剩余列添加到Col1

时间:2016-09-20 19:43:34

标签: sql sql-server tsql

我正在努力研究一种我似乎无法想出办法的逻辑。 的问题: 我有三列PrimaryKey,COl1和COl2,如下面的截图enter image description here

所示

我们来一个新列Col3 = Col1-Col2,

我将Col3中的剩余部分添加到下一行的Col1中,然后再次将其减去Col3。

让我们考虑上面的表格和

PrimaryKey = 1 - > Col3 = 10.2 - 5 = 5.2。

必须将此5.2添加到PrimaryKey = 2的Col1中 15 + 5.2 = 20.2。

现在再次Col3 = 20.2 - 3 = 17.2,像这样它必须迭代下一个记录。

我希望我能够清楚地解释我的问题。如果您需要任何进一步的解释,请告诉我。

*提供的表只是一个示例表,我工作的实际表非常大。

谢谢。

4 个答案:

答案 0 :(得分:1)

据我所知,你想要从col1的累积中减去col2的累积值。在SQL Server 2012+中,您可以这样做:

select t.*,
       sum(col2 - col1) over (order by primary key)
from t;

答案 1 :(得分:0)

您可以在原始表格上使用自我加入,但如果主要密钥未完成,则存在危险,例如在某些时候删除记录。在这里,我使用ROW_NUMBER的自连接来创建一个绝对顺序的密钥 - 这允许我将[此行号]加入[此行号+ 1](如果其他人有更好的方法,则包含示例数据):

DECLARE @YourTable TABLE (PrimaryKey INT IDENTITY(1,1), COL1 FLOAT, COL2 FLOAT)
INSERT INTO @YourTable
        ( COL1, COL2 )
VALUES 
      (10.2, 5.0)
    , (15.0, 3.0)
    , (5.7, 6)
    , (9.0, 5.5)

; WITH TableRanked
AS (
    SELECT PrimaryKey ,
           COL1 ,
           COL2
           , COL3 = COL1 - COL2
           , RowNum = ROW_NUMBER() OVER(ORDER BY PrimaryKey)
    FROM @YourTable
    )
SELECT tr.PrimaryKey ,
       tr.COL1 ,
       tr.COL2 ,
       tr.COL3
       , COL1Next = COALESCE(trNext.COL1, 0)
       , COL4 = tr.COL3 + COALESCE(trNext.COL1, 0)
FROM TableRanked tr
    LEFT JOIN TableRanked trNext
        -- Here's where the magic happens:
        ON trNext.RowNum = (tr.RowNum + 1)

答案 2 :(得分:0)

如果您使用的是SQL Server 2012,则可以使用LEAD。这将获得与Russel发布但具有更好性能的结果相同的结果:

DECLARE @YourTable TABLE (PrimaryKey INT IDENTITY(1,1), COL1 FLOAT, COL2 FLOAT)
INSERT INTO @YourTable (COL1, COL2 )
VALUES  (10.2, 5.0), (15.0, 3.0), (5.7, 6), (9.0, 5.5);

SELECT *, (COL1 - COL2) + LEAD(COL1,1,0) OVER (ORDER BY PrimaryKey)
FROM @YourTable;

答案 3 :(得分:0)

如果此查询有帮助,请与我们联系:

DECLARE @n int 
SELECT @n = count(*) from @yourTable
DECLARE @counter int 
SELECT @counter = MIN(PrimaryKeyCol) from @yourTable
DECLARE @col3 = 0

WHILE (@counter <= @n)
 SELECT @col3 = @col3 + Col1 - Col2 from @yourTable where PrimaryKeyCol = @counter
Print @col3
@counter = @counter + 1
END