在存储过程中遇到问题,急救!!!!

dongtianjie 2006-05-16 02:57:29
需求说明:
有一个销售的一个例子
------------------------------------------------------------
seq dealer proid qty
1 D1 123 1
2 D1 123 -1
3 D1 123 1
4 D2 234 1
5 D2 234 -1
6 D3 234 1

我举了两个比较特殊的例子,现在多上面的数据进行说明
seq 是每条记录的唯一标识
proid 在表中表示一个产品,并且在这个表中proid其实只有一个产品
qty为1表示入账,-1表示销账
如产品123, 是由D1 入-〉销-〉入 所以目的就是返回seq=3
如产品234 由D2 入-〉销, D3 入 所以返回的返seq=6 的纪录
然后将seq=3 和seq=6 插入到另一个表示处理完成的表中。

(仅对这个比较特殊的数据)我的思路是,对用游标得到第一条记录,然后查询
求出sum(qty) 结果为1, 然后在表中查询该proid的qty=1 的记录,
再取消dealer重复值, 则123 返回一个dealer , 234 返回两个dealer

这是发现无法实现需求。
首先,对于123, 返回两个相同的,将seq=1 或 seq=3 多可以插入到需要的表,但是如果返回两个seq , 在存储过程中,如何得到第一条记录的seq值呢???
对于234, 我就没有办法得到结果了。


所以我的思路进行不下去。同时,用游标必须要考虑下一条记录的proid值已经被处理过了
那么检查发现已经处理,如何继续向下移动游标呢,是不是在判断之后用 fetch next from ...
来下移呢?(我还没有来的及测试运行)


所以,希望大家给出帮助,
1、这个问题的正确,简单的解法
2、依据我的思路是否可以进行修正,因为我已经实现了一部分。
3、依据条件移动游标的正确做法是??

确实很急, 两天了,头都大了好几圈了

先谢了

...全文
164 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
昵称被占用了 2006-05-21
  • 打赏
  • 举报
回复
反正用临时表了,总有办法解决


--倒入临时表,以免影响源表
SELECT IDENTITY(int,1,1) as id,*,NULL AS Flag
into #t
from x

--处理
declare @proid varchar(10)
declare @qty int
declare @Flag int

update #t
set @qty=case when @proid=proid then @Qty+Qty else Qty end,
Flag=case when @Qty=0 then 1 else 0 end,
@proid=proid

delete t
from #t t
where exists (
select 1 from #t where flag=1 and proid=t.proid
and id>=t.id
)

--把临时表倒入你的目标表
insert 你的表(seq,dealer,proid,qty)
select seq,dealer,proid,qty from #t

--删除
drop table #t

--删除环境
drop table x
dongtianjie 2006-05-16
  • 打赏
  • 举报
回复
感谢楼上的高人。虽然看的不是很明白,但是对您已经佩服不得了了
seq 只是一个表示,没有先后的意思。
也就是说
and seq>=t.seq
不能被用来使用。
这样我应该如何做呢??
昵称被占用了 2006-05-16
  • 打赏
  • 举报
回复
--给段代码,看看是不是要的效果

--建立测试表
create table x(
seq int,
dealer varchar(10),
proid VARCHAR(10),
qty INT)
GO

--插入数据
INSERT X
SELECT
1, 'D1', '123', 1
UNION ALL SELECT
2 , 'D1' , '123' , -1
UNION ALL SELECT
3 , 'D1' , '123' , 1
UNION ALL SELECT
4 , 'D2' , '234' , 1
UNION ALL SELECT
5 , 'D2' , '234' , -1
UNION ALL SELECT
6 , 'D3' , '234' , 1
GO

--倒入临时表,以免影响源表
SELECT *,NULL AS Flag
into #t
from x

--处理
declare @seq int
declare @proid varchar(10)
declare @qty int
declare @Flag int

update #t
set @seq=seq,
@qty=case when @proid=proid then @Qty+Qty else Qty end,
Flag=case when @Qty=0 then 1 else 0 end,
@proid=proid

delete t
from #t t
where exists (
select 1 from #t where flag=1 and proid=t.proid
and seq>=t.seq
)

--把临时表倒入你的目标表
insert 你的表(seq,dealer,proid,qty)
select seq,dealer,proid,qty from #t

--删除
drop table #t

--删除环境
drop table x




27,580

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧