求救各位大哥!我新人!
我现在有两个表TAB1 ,TAB2
TAB1(应收款表)的结构如下:
BPCNUM BPCNAM SOHNUM SDHNUM JE1(应收款) XC(应收款的项次) ROWID1
客户1 客户1名称 销售订单1 送货单2 1200 1 1
客户1 客户1名称 销售订单1 送货单2 1000 2 2
客户1 客户1名称 销售订单1 送货单3 700 1 3
客户1 客户1名称 销售订单1 送货单3 1100 2 4
TAB2(已付款表)
BPCNUM BPCNAM PAYCUR(付款金额) PAYXC(付款项次) PAYDAT (时间) ROWID2
客户1 客户1名称 200 1 2006-10-25 1
客户1 客户1名称 300 2 2006-10-27 2
客户1 客户1名称 600 3 2006-10-27 3
现在要求用TAB2的表去冲减与TAB客户相同的送货单的应收款,一次冲减,当ROWID=1的充完后继续冲下一个,并产生的结果放入TAB3
BPCNUM BPCNAM SOHNUM SDHNUM JE2(已冲金额) DATE(所冲减对应的收款TAB2的时间)
客户1 客户1名称 销售订单1 送货单2
客户1 客户1名称 销售订单1 送货单3
请大哥们帮忙看一下
问题点数:80、回复次数:6Top
1 楼coolingpipe(冷箫轻笛)回复于 2006-11-03 20:17:05 得分 0
你想要的结果是什么样的呢?Top
2 楼fengyxj(风)回复于 2006-11-03 20:36:51 得分 0
更改:我要的结果是
BPCNUM BPCNAM SOHNUM SDHNUM JE2(已冲金额) XC DATE
客户1 客户1名称 销售订单1 送货单2 200 1
客户1 客户1名称 销售订单1 送货单2 300 1
客户1 客户1名称 销售订单1 送货单2 600 1
Top
3 楼fengyxj(风)回复于 2006-11-03 20:39:34 得分 0
如果TAB2表把“送货单2” 冲完了 接着继续冲 “送货单3 ”最后的目的是把冲完 并得到冲的明细表TAB3Top
4 楼fengyxj(风)回复于 2006-11-03 20:49:40 得分 0
问题改了 对不起各位大哥 我说错了
我现在有两个表TAB1 ,TAB2
TAB1(应收款表)的结构如下:
BPCNUM BPCNAM SOHNUM SDHNUM JE1(应收款) XC(应收款的项次) ROWID1
客户1 客户1名称 销售订单1 送货单2 1200 1 1
客户1 客户1名称 销售订单1 送货单2 1000 2 2
客户1 客户1名称 销售订单1 送货单3 700 1 3
客户1 客户1名称 销售订单1 送货单3 1100 2 4
TAB2(已付款表)
BPCNUM BPCNAM PAYCUR(付款金额) PAYXC(付款次) XC PAYDAT (时间) ROWID2
客户1 客户1名称 200 1 1 2006-10-25 1
客户1 客户1名称 300 2 1 2006-10-27 2
客户1 客户1名称 1600 3 1 2006-10-27 3
现在要求用TAB2的表去冲减与TAB客户相同的送货单的应收款,一次冲减,当ROWID=1的充完后继续冲下一个,并产生的结果放入TAB3(根据TAB2的XC来冲TAB1的XC)
BPCNUM BPCNAM SOHNUM SDHNUM JE2(已冲金额)xc DATE(冲减对应的收款TAB2的时间)
客户1 客户1名称 销售订单1 送货单2 200 1
客户1 客户1名称 销售订单1 送货单2 300 1
客户1 客户1名称 销售订单1 送货单2 700 1
客户1 客户1名称 销售订单1 送货单3 900 1
请大哥们帮忙看一下
Top
5 楼coolingpipe(冷箫轻笛)回复于 2006-11-03 22:40:50 得分 0
--建表
create table tab1
(
BPCNUM varchar(20),
BPCNAM varchar(20),
SOHNUM varchar(20),
SDHNUN varchar(20),
JE1 int,
XC int,
ROWID1 int
)
create table tab2
(
BPCNUM varchar(20),
BPCNAM varchar(20),
PAYCUR INT,
PAYXC INT,
XC int,
PAYDAT varchar(10),
ROWID2 int
)
insert into tab1 select '客户1', '客户1名称', '销售订单1', '送货单2', 1200, 1, 1
insert into tab1 select '客户1', '客户1名称', '销售订单1', '送货单2', 1000, 2, 2
insert into tab1 select '客户1', '客户1名称', '销售订单1', '送货单3', 700, 1, 3
insert into tab1 select '客户1', '客户1名称', '销售订单1', '送货单3', 1100, 2, 4
insert into tab2 select '客户1', '客户1名称', 200, 1, 1, '2006-10-25', 1
insert into tab2 select '客户1', '客户1名称', 300, 2, 1, '2006-10-27', 2
insert into tab2 select '客户1', '客户1名称', 1000, 3, 1, '2006-10-27', 3
--生成临时数据
select bpcnum,bpcnam,sohnum,sdhnun,je1,xc,
zje1 = (select isnull(sum(je1),0) from tab1 where xc = a.xc and rowid1 < a.rowid1),
zje2 = (select sum(je1) from tab1 where xc = a.xc and rowid1 <= a.rowid1)
into #t1
from tab1 a
select bpcnum,bpcnam,paycur,
paycur1 = (select isnull(sum(paycur),0) from tab2 where xc = a.xc and bpcnum = a.bpcnum and rowid2 < a.rowid2),
paycur2 = (select sum(paycur) from tab2 where xc = a.xc and bpcnum = a.bpcnum and rowid2 <= a.rowid2),
xc,paydat,rowid2
into #t2
from tab2 a
--语句
select bpcnum,bpcnam,sohnum,sdhnun,
case
when zje2 > paycur1 and zje2 >= paycur2 and zje1 <= paycur1 then paycur
when zje2 > paycur1 and zje2 < paycur2 and zje1 <= paycur1 then zje2 - paycur1
when zje2 > paycur1 and zje2 < paycur2 and zje1 > paycur1 then paycur
when zje2 > paycur1 and zje2 >= paycur2 and zje1 > paycur1 then paycur - (zje1 - paycur1)
end as je2,
xc,paydat
from
(
select a.*,b.paycur,b.paycur1,b.paycur2,b.paydat
from #t1 a inner join #t2 b
on a.xc = b.xc and a.zje2 >= b.paycur2
and not exists (select 1 from #t1 where xc = a.xc and zje2 < a.zje2 and zje2 > b.paycur2)
union
select a.*,b.paycur,b.paycur1,b.paycur2,b.paydat
from #t1 a inner join #t2 b
on a.xc = b.xc and a.zje2 < b.paycur2 and a.zje2 > b.paycur1
and not exists (select 1 from #t1 where xc = a.xc and zje2 < a.zje2 and zje2 > b.paycur2)
)a
order by a.bpcnum,a.bpcnam,a.xc,a.sohnum
--结果
客户1 客户1名称 销售订单1 送货单2 200 1 2006-10-25
客户1 客户1名称 销售订单1 送货单2 300 1 2006-10-27
客户1 客户1名称 销售订单1 送货单2 700 1 2006-10-27
客户1 客户1名称 销售订单1 送货单3 300 1 2006-10-27
--PS
思路很简单,但是很蠢笨,希望高手指正
Top
6 楼coolingpipe(冷箫轻笛)回复于 2006-11-03 23:07:57 得分 0
--再修改(加客户关联)
select bpcnum,bpcnam,sohnum,sdhnun,
case
when zje2 > paycur1 and zje2 >= paycur2 and zje1 <= paycur1 then paycur
when zje2 > paycur1 and zje2 < paycur2 and zje1 <= paycur1 then zje2 - paycur1
when zje2 > paycur1 and zje2 < paycur2 and zje1 > paycur1 then paycur
when zje2 > paycur1 and zje2 >= paycur2 and zje1 > paycur1 then paycur - (zje1 - paycur1)
end as je2,
xc,paydat
from
(
select a.*,b.paycur,b.paycur1,b.paycur2,b.paydat
from #t1 a inner join #t2 b
on a.bpcnum = b.bpcnum and a.xc = b.xc and a.zje2 >= b.paycur2
and not exists (select 1 from #t1 where xc = a.xc and zje2 < a.zje2 and zje2 > b.paycur2)
union
select a.*,b.paycur,b.paycur1,b.paycur2,b.paydat
from #t1 a inner join #t2 b
on a.bpcnum = b.bpcnum and a.xc = b.xc and a.zje2 < b.paycur2 and a.zje2 > b.paycur1
and not exists (select 1 from #t1 where xc = a.xc and zje2 < a.zje2 and zje2 > b.paycur2)
)a
order by a.bpcnum,a.bpcnam,a.xc,a.sohnum
Top




