Sql server 2008 如何在一个表中减去两列

Sql server 2008 如何在一个表中减去两列,sql-server-2008,Sql Server 2008,我试图减去C列和D列中的值,并将结果放在“Diff”列中 Create table Test_Table (Item INT, [A] INT, [B] INT, [C] INT, [D] INT, [Date] Date ) GO INSERT INTO Test_Table Values (

我试图减去C列和D列中的值,并将结果放在“Diff”列中

Create table Test_Table   
(Item INT,                  
[A] INT,                    
[B] INT,                    
[C] INT,                    
[D] INT,                    
[Date] Date
)
GO
INSERT INTO Test_Table

Values ('107', '136', '1', '3',  '3', '03/21/16'),('109', '136', '1', '2',  '2', '03/21/16'),
       ('110', '136', '1', '1',  '1', '03/21/16'),('108', '136', '2', '10', '4', '03/21/16'),
       ('108', '136', '3', '10', '3', '03/25/16'),('108', '136', '4', '10', '3', '03/26/16'),
       ('115', '138', '5', '5',  '3', '04/01/16'),('115', '138', '6', '5',  '2', '04/04/16')
GO
从测试表中选择*

结果应该是这样的


任何帮助都将不胜感激。

谢谢您的回复。我收到错误消息:Msg 209,16级,状态1,第7行不明确的列名“item”。@Allen_Delon:立即重试现在我收到错误消息:Msg 207,16级,状态1,第7行无效列名“I”。Msg 209,级别16,状态1,第7行不明确的列名“d”。查询中没有添加“Diff”列。仍然是:项目a b c d日期107 136 1 3 3 2016-03-21 109 136 1 2 2016-03-21 110 136 1 1 1 2016-03-21 108 136 2 10 4 2016-03-21 108 136 3 10 3 2016-03-25 108 136 4 10 3 2016-03-26 115 138 5 3 2016-04-01 115 138 6 5 2 2016-04-04@Allen_Delon:请将其发布到原始问题中,而不是作为评论
WITH    i AS
        (
        SELECT  *,
                ROW_NUMBER() OVER (PARTITION BY item ORDER BY date) rn
        FROM    test_table
        )
SELECT  i.item, i.a, i.b,
        io.c + COALESCE(dd, 0) c,
        io.c + COALESCE(dd, 0) - i.d diff,
        i.d, i.date
FROM    i
CROSS APPLY
        (
        SELECT  *
        FROM    i io
        WHERE   item = i.item
                AND rn = 1
        ) io
CROSS APPLY
        (
        SELECT  SUM(-d) dd
        FROM    i ii
        WHERE   item = io.item
                AND rn < i.rn
        ) ii
WITH    i AS
        (
        SELECT  *,
                ROW_NUMBER() OVER (PARTITION BY item ORDER BY date) rn
        FROM    test_table
        )
SELECT  i.item, i.a, i.b,
        io.c + COALESCE(dd, 0) c,
        io.c + COALESCE(dd, 0) - i.d diff,
        i.d, i.date
FROM    i
CROSS APPLY
        (
        SELECT  *
        FROM    i io
        WHERE   item = i.item
                AND rn = 1
        ) io
CROSS APPLY
        (
        SELECT  SUM(-d) dd
        FROM    i ii
        WHERE   item = io.item
                AND rn < i.rn
        ) ii
SELECT  item, a, b,
        FIRST_VALUE(c) OVER (PARTITION BY item ORDER BY date) +
        SUM(-d) OVER (PARTITION BY item ORDER BY date),
        d, date
FROM    test_table