将值减去多行 - SQL

时间:2014-01-27 23:55:57

标签: sql sql-server select mysqli hana

好吧,我遇到了需要在多行中分配值的问题。由于我不知道具体的术语,为了更好地理解,我会以下面的例子形式提出:

假设x的值为20,我需要按降序将其分配/减去行。

TABLE:

ID        Value1 
1          6             
2          5
3          4
4          3
5          9

结果应如下所示:(x = 20)

ID        Value1     Answer
1          6           14    
2          5           9
3          4           5
4          3           2
5          9           0

任何人都可以给我一个想法,我怎么能用这个?我希望我的问题很清楚。如果没有,请告诉我。

感谢。任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:2)

未经测试的语法,但这个想法应该适用于SQL Server 2005及更新版本。

SQL Server 2012具有SUM OVER子句,这使得它更加便捷。

SELECT ID, Value1, CASE WHEN 20-SumA < 0 THEN 0 ELSE 20-SumA END AS Answer
FROM TABLE A
CROSS APPLY (SELECT SUM(B.Answer) SumA FROM TABLE B
   WHERE B.ID <= A.ID) CA

答案 1 :(得分:1)

我不明白你的问题。我知道我认为你想做什么。但是你的例子没有意义。

你说你要在5行中分配20,但Value1和Answer之间的差值总和只有3(8 + 4 + 1 + -1 + -9)。

您想如何分配价值?使用基于Value1?

中的值的扩展/拆分

编辑:我做了一个例子,它将你在上面指定的值上分开20:

DECLARE @x FLOAT = 20.0

DECLARE @values TABLE (
  ID INT,
  VALUE FLOAT,
  NEWVAL FLOAT)

INSERT INTO @values (ID, VALUE) VALUES (1,6), (2,5),(3,4),(4,3),(5,9)

UPDATE f
SET [NEWVAL] = [newValue]
FROM @values f
INNER JOIN (
    SELECT 
        ID,
        value + ((VALUE / [maxValue]) * @x) [newValue]
    FROM
        @values
        CROSS APPLY (
            SELECT
                SUM(value) [maxValue]
            FROM
                @values
        ) m 
) a ON a.ID = f.ID

SELECT * FROM @values

不幸的是,我必须将你的值更改为浮点数才能实现。如果你需要它们作为整数,你需要使用舍入,然后计算新值之和的差值 - @x然后在行上分散差值(如果> 1则加上最小数字,如果&lt; 1从最大值减去)。你的舍入应该通常只有1或2。

我甚至不知道我是否正在尝试这样做。

答案 2 :(得分:1)

以不同的方式思考这个问题可能更容易。您想要计算value1的累计总和,然后从@X中减去该值。如果差异为负,则输入0

如果您使用的是SQL Server 2012,则内置累积和。你可以这样做:

select id, value1,
       (case when @X - cumvalue1 < 0 then 0 else @X - cumvalue1 end) as answer
from (select id, value1,
             sum(value1) over (order by id) as cumvalue1
      from table t
     ) t;

如果您没有累积金额,则可以使用子查询来执行此操作:

select id, value1,
       (case when @X - cumvalue1 < 0 then 0 else @X - cumvalue1 end) as answer
from (select id, value1,
             (select sum(value1)
              from table t2
              where t2.id <= t.id
             ) as cumvalue1
      from table t
     ) t;