sql运行总修改

时间:2017-05-25 11:14:07

标签: sql sql-server tsql

我有一个包含列的表: ID Type (使用' IN'' Out'字符串),以及价值(持有货币数据)

我需要按照以下逻辑,通过 Value 的求和来减去每一行的余额:

  • 如果Type =' In'然后总和值
  • 如果Type =' Out'然后减去值

我尝试了一些东西,但我无法确定进出的位置:

ID  Type      Value  and in balance like this Balance
21  In        55                              55
22  IN        78                              133
23  Out       15                              118
24  Out       56                              62
25  In        72                              134
26  Out       5                               129

我有这样的代码:

SELECT  ID ,
        Value ,
        ( SELECT    SUM(y.Value)
          FROM      dbo.Reestr y
          WHERE     y.ID <= x.ID

        ) AS RunningTotal
FROM    dbo.Reestr x
ORDER BY 1 ,2 ,3;

2 个答案:

答案 0 :(得分:5)

只需使用累积和函数即可。这在SQL Server 2012 +中可用:

select r.id, r.value,
       sum(case when r.type = 'in' then value
                when r.type = 'out' then - value
           end) over (order by r.id) as balance
from dbo.Reestr r
ORDER BY 1, 2, 3;

通过在子查询中包含case表达式,可以对相关子查询执行相同的操作。

答案 1 :(得分:1)

试试这个

SELECT  ID ,
            Value ,
            (select sum(case when Type = 'IN' then Value 
                             when Type='OUT' then (0-value) end) 
             FROM dbo.Reestr y where x.Id>=y.id) AS RunningTotal
    FROM    dbo.Reestr x
    ORDER BY 1 ,2 ,3;