好吧,我遇到了需要在多行中分配值的问题。由于我不知道具体的术语,为了更好地理解,我会以下面的例子形式提出:
假设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
任何人都可以给我一个想法,我怎么能用这个?我希望我的问题很清楚。如果没有,请告诉我。
感谢。任何帮助将不胜感激。
答案 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;