欠料数量,求一SQL语句

wsxcdx 2011-11-10 11:03:02
环境:sql 2000
表结构和测试数据如下

create table tb_qty
(
KPNO varchar(10),
QTY float
)

insert into tb_qty(KPNO,QTY) values('A01','100')
insert into tb_qty(KPNO,QTY) values('A02','100')
insert into tb_qty(KPNO,QTY) values('A03','100')
insert into tb_qty(KPNO,QTY) values('A04','100')
insert into tb_qty(KPNO,QTY) values('A05','100')

create table tb_ODNO
( SDATE varchar(8),
WKNO varchar(10),
PNO varchar(10),
KPNO varchar(10),
NQTY float
)

insert into tb_ODNO(SDATE,WKNO,PNO,KPNO,NQTY)values('20111111','100001','AAA','A01','80')
insert into tb_ODNO(SDATE,WKNO,PNO,KPNO,NQTY)values('20111111','100001','AAA','A02','60')
insert into tb_ODNO(SDATE,WKNO,PNO,KPNO,NQTY)values('20111111','100001','AAA','A03','50')
insert into tb_ODNO(SDATE,WKNO,PNO,KPNO,NQTY)values('20111112','100002','BBB','A01','60')
insert into tb_ODNO(SDATE,WKNO,PNO,KPNO,NQTY)values('20111112','100002','BBB','A02','100')
insert into tb_ODNO(SDATE,WKNO,PNO,KPNO,NQTY)values('20111112','100002','BBB','A03','50')
insert into tb_ODNO(SDATE,WKNO,PNO,KPNO,NQTY)values('20111112','100002','BBB','A04','120')
insert into tb_ODNO(SDATE,WKNO,PNO,KPNO,NQTY)values('20111112','100002','BBB','A05','120')

根据SDATE的顺序分配QTY,已分配的数量在QTY里要减掉

要求结果如下
SDATE WKNO PNO KPNO NQTY OQTY
------------------------------------------------
20111111 100001 AAA A01 80 0
20111111 100001 AAA A02 60 0
20111111 100001 AAA A03 50 0
20111112 100002 BBB A01 60 -40
20111112 100002 BBB A02 100 -60
20111112 100002 BBB A03 50 0
20111112 100002 BBB A04 120 -20
20111112 100002 BBB A05 120 -20

请大家帮忙,谢谢。
...全文
391 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
geniuswjt 2011-11-10
  • 打赏
  • 举报
回复
循环写还是很简单的,LZ自己想下[Quote=引用 14 楼 wsxcdx 的回复:]

这条件看的有点晕,拿到正是数据库测试还是有问题
有没有人能帮忙写个存储过程,用临时表,游标都行
分不够可以另开帖加分
[/Quote]
wsxcdx 2011-11-10
  • 打赏
  • 举报
回复
这条件看的有点晕,拿到正是数据库测试还是有问题
有没有人能帮忙写个存储过程,用临时表,游标都行
分不够可以另开帖加分
pengxuan 2011-11-10
  • 打赏
  • 举报
回复

select a.*,OQTY=case when Qty-(select sum(NQTY) from tb_odno where SDATE<=a.SDATE and KPNO=a.KPNO)>0 then 0 else Qty-(select sum(NQTY) from tb_odno where SDATE<=a.SDATE and KPNO=a.KPNO) end from tb_odno a inner join tb_qty b on a.KPNO=b.KPNO
/*
SDATE WKNO PNO KPNO NQTY OQTY
-------- ---------- ---------- ---------- ---------------------- ----------------------
20111111 100001 AAA A01 80 0
20111111 100001 AAA A02 60 0
20111111 100001 AAA A03 50 0
20111112 100002 BBB A01 60 -40
20111112 100002 BBB A02 100 -60
20111112 100002 BBB A03 50 0
20111112 100002 BBB A04 120 -20
20111112 100002 BBB A05 120 -20

(8 行受影响)

*/
geniuswjt 2011-11-10
  • 打赏
  • 举报
回复
我也来膜拜下,折腾了10来分钟没折腾出来。。。
  • 打赏
  • 举报
回复
我也来膜拜一个,KPNO = b.KPNO and (SDATE < b.SDATE
or SDATE = b.SDATE and WKNO< b.WKNO
or SDATE = b.SDATE and WKNO= b.WKNO and PNO <= b.PNO)
就这条件,至少是偶想不全的
wsxcdx 2011-11-10
  • 打赏
  • 举报
回复
存储过程,游标,循环都可以啊
谢谢海爷,先试试看
-晴天 2011-11-10
  • 打赏
  • 举报
回复
前两天用循环做过一个.
Mr_Nice 2011-11-10
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 haiwer 的回复:]

SQL code
select b.*
,case when a.qty >= (select sum(nqty) from tb_ODNO where KPNO = b.KPNO and (SDATE < b.SDATE
or SDATE = b.SDATE and WKNO< b.WKNO
or SDATE = b.SDATE and WKNO= b.WKNO and PNO <=……
[/Quote]

绝对是写了很多次的。 厉害!!!
黄_瓜 2011-11-10
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 fredrickhu 的回复:]

引用 2 楼 haiwer 的回复:
SQL code
select b.*
,case when a.qty >= (select sum(nqty) from tb_ODNO where KPNO = b.KPNO and (SDATE < b.SDATE
or SDATE = b.SDATE and WKNO< b.WKNO
or SDATE = b.SDATE and WKN……
[/Quote]
膜拜
--小F-- 2011-11-10
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 haiwer 的回复:]
SQL code
select b.*
,case when a.qty >= (select sum(nqty) from tb_ODNO where KPNO = b.KPNO and (SDATE < b.SDATE
or SDATE = b.SDATE and WKNO< b.WKNO
or SDATE = b.SDATE and WKNO= b.WKNO and PNO ……
[/Quote]

靠 膜拜海爷。
黄_瓜 2011-11-10
  • 打赏
  • 举报
回复
结果是不是有点问题?
昵称被占用了 2011-11-10
  • 打赏
  • 举报
回复
2005+可以用cte避免重复查询
2000可以用临时表避免重复查询,但是并不一定是否需要,也就是说,上面语句性能可能不好
--小F-- 2011-11-10
  • 打赏
  • 举报
回复
库存的先进先出?
昵称被占用了 2011-11-10
  • 打赏
  • 举报
回复
select b.*
,case when a.qty >= (select sum(nqty) from tb_ODNO where KPNO = b.KPNO and (SDATE < b.SDATE
or SDATE = b.SDATE and WKNO< b.WKNO
or SDATE = b.SDATE and WKNO= b.WKNO and PNO <= b.PNO)
) then 0 else a.qty - (select sum(nqty) from tb_ODNO where KPNO = b.KPNO and (SDATE < b.SDATE
or SDATE = b.SDATE and WKNO< b.WKNO
or SDATE = b.SDATE and WKNO= b.WKNO and PNO <= b.PNO)
) end
from tb_qty a,tb_ODNO b
where a.KPNO = b.KPNO
-晴天 2011-11-10
  • 打赏
  • 举报
回复
力气活.
wsxcdx 2011-11-10
  • 打赏
  • 举报
回复
经查找是自己写错字段,海爷的SQL能满足要求
谢谢海爷,谢谢大家,结帖了
q465897859 2011-11-10
  • 打赏
  • 举报
回复
+1[Quote=引用 16 楼 haiwer 的回复:]
引用 14 楼 wsxcdx 的回复:
这条件看的有点晕,拿到正是数据库测试还是有问题
有没有人能帮忙写个存储过程,用临时表,游标都行
分不够可以另开帖加分

关键是什么情况不对要说清楚,否则再写也不知道怎么写了
[/Quote]
昵称被占用了 2011-11-10
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 wsxcdx 的回复:]
这条件看的有点晕,拿到正是数据库测试还是有问题
有没有人能帮忙写个存储过程,用临时表,游标都行
分不够可以另开帖加分
[/Quote]
关键是什么情况不对要说清楚,否则再写也不知道怎么写了

34,875

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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