关于SQL Server的循环更新问题

数据表:日期总数已用剩余2013-05-315052013-06-3010010输入数值:6希望得到的结果:日期总数已用剩余2013-05-315502013-06-30... 数据表:
日期 总数 已用 剩余

2013-05-31 5 0 5

2013-06-30 10 0 10

输入数值:6
希望得到的结果:
日期 总数 已用 剩余

2013-05-31 5 5 0

2013-06-30 10 1 9

非常感谢!
展开
 我来答
darlingks
2013-09-03 · TA获得超过222个赞
知道小有建树答主
回答量:638
采纳率:75%
帮助的人:174万
展开全部
建表[M_Info做表名 日期[M_Datetime ], 总数[Fssums], 已用[Used], 剩余[Brand_new]:
CREATE Table M_Info(
                    M_Datetime Datetime,
                    Fssums int,
                    Used int,
                    Brand_new int)
INSERT INTO M_Info Values('2013-05-31', 5, 0, 5)
INSERT INTO M_Info Values('2013-06-30', 10, 0, 10)

代码部分:
DECLARE @Input int
DECLARE @MinDT DateTime
SET @Input = 6
While @Input>0 
begin
  SELECT @MinDT = MIN(M_Datetime) from M_Info where Brand_new>0
  UPDATE A SET A.Used = A.Used + 1, A.Brand_new = A.Brand_new - 1 FROM M_Info A
  WHERE A.Brand_new>0 AND A.M_Datetime=@MinDT
  SET @Input = @Input - 1
end

我觉得有更好的办法, 使用同表连接用Exists来判断日期, 我这里用了一个@MinDT变量, 我的意思是这个变量应该有办法不使用的!期待高手!

鈾氶瓏鈾
2016-12-14 · 知道合伙人软件行家
鈾氶瓏鈾
知道合伙人软件行家
采纳数:718 获赞数:1337

向TA提问 私信TA
展开全部
建表[M_Info做表名 日期[M_Datetime ], 总数[Fssums], 已用[Used], 剩余[Brand_new]:
CREATE Table M_Info(
                    M_Datetime Datetime,
                    Fssums int,
                    Used int,
                    Brand_new int)
INSERT INTO M_Info Values('2013-05-31', 5, 0, 5)
INSERT INTO M_Info Values('2013-06-30', 10, 0, 10)
 
代码部分:
DECLARE @Input int
DECLARE @MinDT DateTime
SET @Input = 6
While @Input>0 
begin
  SELECT @MinDT = MIN(M_Datetime) from M_Info where Brand_new>0
  UPDATE A SET A.Used = A.Used + 1, A.Brand_new = A.Brand_new - 1 FROM M_Info A
  WHERE A.Brand_new>0 AND A.M_Datetime=@MinDT
  SET @Input = @Input - 1
end
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
tj_angela
2013-09-03 · TA获得超过7530个赞
知道大有可为答主
回答量:6797
采纳率:75%
帮助的人:2549万
展开全部
with t1 as (select 6 as flag)
select a.日期,a.总数,(case when (tmp_data-flag)<=0 then 0 else (tmp_data-flag) end) as "已用",
a.总数- (case when (tmp_data-flag)<=0 then 0 else (tmp_data-flag) end ) as “剩余"
from (
select a.日期,a.总数,a.已用,a.剩余,sum(b.总数) tmp_data
from (select 日期,总数,已用,剩余,row_number() over(order by 日期 asc) num from table_name) a
left join (select 日期,总数,已用,剩余,row_number() over(order by 日期 asc) num from table_name) b on a.num>=b.num
group by a.日期,a.总数,a.已用,a.剩余
) p, t1

这样吧
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
zxd9915
2013-09-03 · TA获得超过299个赞
知道小有建树答主
回答量:461
采纳率:50%
帮助的人:210万
展开全部
变态的需求。
假定表名称为A,有ID字段,总数为zs,已用为yy,剩余字段请自行解决。
declare @sl int
set @sl=6
declare @sysl int
declare @id int
while @sl>0
begin
set @id = (SELECT top 1 id FROM A where zs-yy>0)
set @sysl = (select zs-yy from A where id=@id)
if @sl>@sysl
begin
update a set yy=@sysl where id=@id
end
else
begin
update a set yy=@sl where id=@id
end
set @sl=@sl-@sysl
if @sl <=0
break
else
continue
end
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
szm341
2013-09-03 · TA获得超过6726个赞
知道大有可为答主
回答量:5005
采纳率:100%
帮助的人:5131万
展开全部
sqlserver什么版本?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式