所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路。
sql循环取差值,该怎么写?
http://bbs.csdn.net/topics/390636438?page=1#post-396012416
现在有一组 条件 和 一个 数字(比如是10)
根据条件可以查出若干条数据 ,比如是这么样子的
ID Num NumOut
1 4 0
2 5 0
3 8 0
4 6 0……
按顺序 用每一条记录的 Num减去 数字,够减NumOut赋值为差值,不够减,NumOut赋值与Num相同,再用下一个减剩余数量。
也就是说,以上的数据会被更新为:
ID Num NumOut
1 4 4
2 5 5
3 8 1
4 6 0……
这应该如何用sql语句表达???
按我的想法应该写个循环,判断的,但从来没写过sql的循环,查出的数据又该怎么保存呢?急用,多谢指教了!!!
下面是我的解法:
-
--drop table tb
-
-
create
TABLE tb (
ID
int,
Num
int,NumOut
int)
-
INSERT
into tb
-
SELECT
1,
4,
0
UNION ALL
-
SELECT
2,
5,
0
UNION ALL
-
SELECT
3,
8,
0
UNION ALL
-
SELECT
4,
6,
0
-
go
-
-
-
--你要减的数
-
declare @
num
int
-
-
set @
num =
10
-
-
;with t
-
as
-
(
-
select *,
-
row_number()
over(
order
by @@servername)
as
rownum
-
from tb
-
),
-
-
tt
-
as
-
(
-
select
id,
-
num,
-
numout,
-
(
select
sum(
num)
from t t2
-
where t2.rownum <= t1.rownum)
as sum_num
-
from t t1
-
)
-
-
--更新
-
update tt
-
set numout =
case
when sum_num <= @
num
-
then
num
-
when sum_num > @
num
and
-
@
num - (sum_num -
num) >=
0
-
then @
num - (sum_num -
num)
-
else
0
-
end
-
-
-
--查询
-
select *
from tb
-
/*
-
ID Num NumOut
-
1 4 4
-
2 5 5
-
3 8 1
-
4 6 0
-
*/