CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  MS-SQL Server >  基础类

求救各位大哥!我新人!

楼主fengyxj(风)2006-11-03 19:50:40 在 MS-SQL Server / 基础类 提问

我现在有两个表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

相关问题

关键词

得分解答快速导航

  • 帖主:fengyxj

相关链接

  • SQL Server类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo