首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 求一存储过程 [已结贴,结贴人:jsnjzyx]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-08 10:32:30 楼主
    刚刚被csdn的服务器搞糊涂了,重发一遍,到原帖回同样有分


    表结构如下:
    row_id      time      amount  status
    1          10:20        20.00      yes
    2          10:21        30.00      no
    3          10:22        40.00      no
    4          10:23        60.00      no


    求一存储过程,存储过程只传一个参数@a,要求将时间最前的几条status为no的amount总和等于@a的status设成yes 

    如传@a=30  结果row_id为2的那条记录的ststus更新为yes
    如传@a=70  结果row_id为2、3的那两条记录的ststus更新为yes
    如传@a=130  结果row_id为2、3、4的那三条记录的ststus更新为yes

    1、@a也是存在另一个表中的,不会出现别的值,所以不必考虑@a不是30、70、130

    2、没办法,程序原来是这样设计的,现在也只能这样做了

    3、想过用循环,具体的代码如何做呢?


    谢谢   

    30  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-08 10:42:411楼 得分:1
    貌似背包问题?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-08 10:44:192楼 得分:0
    引用 1 楼 libin_ftsafe 的回复:
    貌似背包问题?

    背包问题?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • dawugui
    • 等级:
    发表于:2008-05-08 10:45:243楼 得分:2
    这个得用循环或油标去搞.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-08 10:47:244楼 得分:2
    declare @a int

    update ta
    set status  = 'yes',
        @a = amount - @a
    where @a > 0 and status = 'no'

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-08 10:49:445楼 得分:0
    引用 3 楼 dawugui 的回复:
    这个得用循环或油标去搞.

    呵呵,知道原理啊,就是求一段代码啊
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-08 10:55:136楼 得分:20
    SQL code
    declare @ta table(row_id int,time varchar(10), amount numeric(12,2), status varchar(8)) insert @ta select 1 ,'10:20', 20.00 ,'yes' union select 2 ,'10:21', 30.00 ,'no' union select 3 ,'10:22', 40.00 ,'no' union select 4 ,'10:23', 60.00 ,'no' declare @a int set @a = 70 update @ta set status = case when @a <= -amount then 'no' else 'yes'end , @a = @a -amount where status = 'no' select * from @ta /* row_id time amount status ----------- ---------- -------------- -------- 1 10:20 20.00 yes 2 10:21 30.00 yes 3 10:22 40.00 yes 4 10:23 60.00 no (所影响的行数为 4 行) */
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-08 10:56:367楼 得分:4
    declare @ta table(row_id int,time varchar(10),      amount numeric(12,2),  status  varchar(8))
    insert @ta select
    1          ,'10:20',        20.00      ,'yes' union select 
    2          ,'10:21',        30.00      ,'no' union select 
    3          ,'10:22',        40.00      ,'no' union select 
    4          ,'10:23',        60.00      ,'no'


    declare @a int
    set @a = 70
    update @ta
    set status  =  case when @a >= 0 then 'yes' else 'no'end ,
        @a = @a -amount 
    where    status = 'no'

    select * from @ta

    row_id      time      amount        status 
    ----------- ---------- -------------- --------
    1          10:20      20.00          yes
    2          10:21      30.00          yes
    3          10:22      40.00          yes
    4          10:23      60.00          no

    (所影响的行数为 4 行)
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-08 10:57:398楼 得分:1
    小枪的做法不错,不过有点问题。
    如果@a=100,结果就会出错了。。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-08 11:05:219楼 得分:0
    谢谢,算解决了吧,因为原则上@a不会出现100
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    世纪乐知(北京)网络技术有限公司 版权所有 京 ICP 证 020026 号
    Copyright © 2000-2007, CSDN.NET, All Rights Reserved