2016-09-20 105 views
0

我想上我似乎无法找出一个办法做到这一点逻辑工作。 问题: 我有三列的PrimaryKey,COL1和COL2如下面的截图所示enter image description here减去两列(Col1中-col2的),并添加剩余下一行Col1中

让我们来新列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,这样它遍历下一记录。

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

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

谢谢。

+0

请编辑您的问题,并显示结果,最好以文本表 –

回答

1

据我所知,你想COL2从累计COL1的减去累计值。在SQL Server 2012+,你会怎么做:

select t.*, 
     sum(col2 - col1) over (order by primary key) 
from t; 
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) 
0

如果您使用的是SQL Server 2012中,你可以使用铅。这将让你同样的结果是什么罗素发布,但具有更好的性能:

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; 
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 
相关问题