CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  MS-SQL Server >  基础类

求SQL语句??

楼主ibenben(笨笨)2004-09-04 15:51:20 在 MS-SQL Server / 基础类 提问

数据库里面主要有两个表,结构如下:  
  入库表rk(入库编号*,入库日期,产品编号,数量)  
  出库表ck(出库编号*,出库日期,产品编号,数量)  
  出库按先进先出法(即先入库的产品(按入库日期),先出库),  
  要求查询库存,按入库日期列出产品的库存数量,用SQL语句如何写???  
  例如:  
  入库表rk(入库编号*,   入库日期,   产品编号,数量)  
                      001           2004-01-01     001      100  
                      002           2004-01-02     001         200  
   
  出库表ck(出库编号*,   出库日期,   产品编号,数量)  
                      001           2004-01-02       001           50  
   
  查询库存时显示如下:  
      入库编号*,   入库日期,   产品编号,数量  
          001           2004-01-01     001      50  
                      002           2004-01-02     001         200   
   
  用SQL语句如何实现呀??大家帮帮忙呀?? 问题点数:50、回复次数:27Top

1 楼leozhzh(是是是是)回复于 2004-09-04 15:58:37 得分 0

select   rk.入库编号,rk.入库日其,rk.产品编号,rk.数量-ck.数量   as   数量  
  from   rk,ck(*)  
  where   rk.入库编号=ck.出库编号Top

2 楼leozhzh(是是是是)回复于 2004-09-04 16:01:19 得分 0

错了  
  是  
  from   rk(*),ck  
   
  不知道行不行  
  大家指教Top

3 楼zhangzs8896(小二)回复于 2004-09-04 16:02:10 得分 0

select   a.入库编号*,   a.入库日期,a.产品编号,  
                数量=(a.数量-b.数量)  
  from   rk   a   left   join   ck   b   on   a.入库编号*=b.出库编号*,Top

4 楼zhangzs8896(小二)回复于 2004-09-04 16:07:46 得分 0

 
  select   a.入库编号,   a.入库日期,a.产品编号,  
                数量=case   when   b.数量     is   null   then   a.数量   else   (a.数量-b.数量)   end    
  from   rk   a   left   join   ck   b   on   a.入库编号=b.出库编号Top

5 楼yesterday2000(一笑而过)回复于 2004-09-04 16:09:01 得分 5

create   table   rk   (入库编号   char   (3),   入库日期   char   (10),   产品编号   char   (3),数量   [decimal](12,   2))  
  create   table   ck   (出库编号   char   (3),   入库日期   char   (10),   产品编号   char   (3),数量   [decimal](12,   2))  
   
  insert   into   rk  
  select   '001','2004-01-01','001',100  
  union  
  select   '002','2004-01-02','001',200  
  insert   into   ck  
  select   '001','2004-01-02','001',20  
   
   
  select   isnull   (a.入库编号,b.出库编号)   as   入库编号,  
  isnull   (a.入库日期,null)   as   入库时期,  
  isnull   (a.产品编号,b.产品编号)   as   产品编号,  
  isnull   (a.数量,0)-isnull(b.数量,0)   as   数量  
  from   rk   a   full   join   ck   b    
  on   a.入库编号=b.出库编号Top

6 楼zhangzs8896(小二)回复于 2004-09-04 16:10:17 得分 0

老是写错!  
  select   a.入库编号,   convert(varchar(10),a.入库日期,120)as   入库日期   ,a.产品编号,  
                数量=case   when   b.数量     is   null   then   a.数量   else   (a.数量-b.数量)   end    
  from   rk   a   left   join   ck   b   on   a.入库编号=b.出库编号  
   
  --测试:  
  create   table   rk(入库编号   varchar(5),   入库日期   datetime,   产品编号   varchar(5),数量   int)  
  insert   rk   values('001','2004-01-01','001',100)  
  insert   rk   values('002','2004-01-02','001',200)  
  create   table   ck(出库编号   varchar(5),   出库日期   datetime,   产品编号   varchar(5),数量   int)  
  insert   ck   values('001','2004-01-02','001',50)  
   
   
  select   a.入库编号,   convert(varchar(10),a.入库日期,120)as   入库日期   ,a.产品编号,  
                数量=case   when   b.数量     is   null   then   a.数量   else   (a.数量-b.数量)   end    
  from   rk   a   left   join   ck   b   on   a.入库编号=b.出库编号  
   
  drop   table   rk,ck  
   
  --结果:  
  入库编号     入库日期               产品编号     数量                      
  -----   ----------   -----   -----------    
  001       2004-01-01   001       50  
  002       2004-01-02   001       200Top

7 楼zjcxc(邹建)回复于 2004-09-04 16:11:24 得分 0

楼主要求的是先进先出,上面的方法是不对的.Top

8 楼zheninchangjiang(徐若涵)回复于 2004-09-04 16:11:27 得分 0

先进先出,只是纯会计方法了,没有实物保管的先进先出?Top

9 楼zheninchangjiang(徐若涵)回复于 2004-09-04 16:12:13 得分 0

我写不出,所以我会在出库表中写入入库的编号Top

10 楼zhangzs8896(小二)回复于 2004-09-04 16:23:16 得分 0

我想的先进先出,是在ck表中体现的。上面的的确不对。不知道下面可以吗?  
  create   table   rk(入库编号   varchar(5),   入库日期   datetime,   产品编号   varchar(5),数量   int)  
  insert   rk   values('001','2004-01-01','001',100)  
  insert   rk   values('002','2004-01-02','001',200)  
  create   table   ck(出库编号   varchar(5),   出库日期   datetime,   产品编号   varchar(5),数量   int)  
  insert   ck   values('001','2004-01-02','001',50)  
  insert   ck   values('001','2004-01-03','001',10)  
   
  select   出库编号,数量=sum(数量)    
  into   #ck    
  from   ck  
  group   by   出库编号  
  select   a.入库编号,   convert(varchar(10),a.入库日期,120)as   入库日期   ,a.产品编号,  
                数量=case   when   b.数量     is   null   then   a.数量   else   (a.数量-b.数量)   end    
  from   rk   a   left   join   #ck   b   on   a.入库编号=b.出库编号  
   
   
  drop   table   rk,ck,#ck  
   
  --结果:  
  入库编号     入库日期               产品编号     数量                      
  -----   ----------   -----   -----------    
  001       2004-01-01   001       40  
  002       2004-01-02   001       200Top

11 楼zjcxc(邹建)回复于 2004-09-04 16:43:08 得分 0

--我想的先进先出,是在ck表中体现的。上面的的确不对。不知道下面可以吗?  
  create   table   rk(入库编号   varchar(5),   入库日期   datetime,   产品编号   varchar(5),数量   int)  
  insert   rk   values('001','2004-01-01','001',100)  
  insert   rk   values('002','2004-01-02','001',200)  
  create   table   ck(出库编号   varchar(5),   出库日期   datetime,   产品编号   varchar(5),数量   int)  
  insert   ck   values('001','2004-01-02','001',50)  
  insert   ck   values('001','2004-01-03','001',10)  
  insert   ck   values('001','2004-01-03','001',100)     --加条记录就不对了.  
   
  select   出库编号,数量=sum(数量)    
  into   #ck    
  from   ck  
  group   by   出库编号  
  select   a.入库编号,   convert(varchar(10),a.入库日期,120)as   入库日期   ,a.产品编号,  
                数量=case   when   b.数量     is   null   then   a.数量   else   (a.数量-b.数量)   end    
  from   rk   a   left   join   #ck   b   on   a.入库编号=b.出库编号  
   
   
  drop   table   rk,ck,#ck  
   
  Top

12 楼zhangzs8896(小二)回复于 2004-09-04 16:53:01 得分 0

老大,加条记录也可以啊,我出库给的就是2条,楼主的一条记录。  
  你说的,那不就是   负库存吗?应该可以的啊。  
   
  --还是不理解,先进先出,到底是想怎么样。Top

13 楼zjcxc(邹建)回复于 2004-09-04 17:00:11 得分 0

加那条记录应该冲减第二条入库记录.Top

14 楼zjcxc(邹建)回复于 2004-09-04 17:39:56 得分 0

应该要用临时表处理才行.  
  Top

15 楼SuperFC(●捡分e族●)回复于 2004-09-04 18:23:23 得分 0

mark一下先,学习ingTop

16 楼SuperFC(●捡分e族●)回复于 2004-09-04 18:43:45 得分 0

先进先出到底是想达到什么样子的输出结果,各位老大可以给个数据看看先吗?Top

17 楼ibenben(笨笨)回复于 2004-09-04 19:49:51 得分 0

所谓先进先出法,就是先入库的产品出库的时候先出呀,即同一种产品出库的时候,  
  最先入库(按入库的日期)的那批先出库呀!!  
  另外,上面的‘出库编号’和‘入库编号’只是个关键字而以,没有别的意义!!  
   
  再举个例子吧:  
  入库表rk(入库编号*,   入库日期,   产品编号,数量)  
                    r001           2004-01-01     001      90  
                    r002           2004-01-02     001         200  
                    r003           2004-01-03     001         100  
   
  出库表ck(出库编号*,   出库日期,   产品编号,数量)  
                    C001           2004-01-02       001           50  
                    C002           2004-01-03       001         100  
   
  根据出库表的记录,出库表有两条记录,  
  第一条   编号C001 出库日期01-02     出库数量是50,  
      那么出库的时候在入库表中找出最先入库的产品,  
      即入库编号为r001的那批为最先入库的产品,  
      所以编号为r001的这批产品数量减去出库的数量50  
      最后,编号为r001的这批产品的库存量为40(即90-50=40)  
  第二条 编号C002 出库日期01-03     出库数量是100,  
      那么出库的时候在入库表中找出最先入库的产品,  
      即入库编号为r001的那批为最先入库的产品(目前库存量为40),  
      出库数量还差60,所以继续在入库表中找出最先入库的产品,  
      即入库编号为r002的那批为最先入库的产品(库存量为200),  
      所以200-60=140(r002的库存量为140)   
  查询库存的时候显示如下:  
  入库编号*,   入库日期,   产品编号,数量(库存量)  
    r001           2004-01-01     001      0  
    r002           2004-01-02     001         140  
    r003           2004-01-03     001         100  
   
  大家帮帮忙,看用SQL语句能实现吗??  
   
   
   
        
        
   
  Top

18 楼zheninchangjiang(徐若涵)回复于 2004-09-04 20:03:02 得分 5

这个应该可以实现,因为以前有个按先进先出的求出库的,但这个必然会使数据查询速度减慢,所以建议还是在出库中增个入库编号,对于不同的编号的库存,在出库中使用不同的行来记录Top

19 楼zhangzs8896(小二)回复于 2004-09-04 20:36:26 得分 5

这回明白什么意思了,试了半天,还是不会做!呵呵Top

20 楼zjcxc(邹建)回复于 2004-09-04 21:38:30 得分 35

--测试  
   
  --测试数据  
  create   table   rk(入库编号   char(4),入库日期   datetime,产品编号   char(3),数量   int)  
  insert   rk   select   'r001','2004-01-01','001',90  
  union   all   select   'r002','2004-01-02','001',200  
  union   all   select   'r003','2004-01-03','001',100  
  union   all   select   'r004','2004-01-03','001',100  
  union   all   select   'r005','2004-01-03','002',100  
   
  create   table   ck(出库编号   char(4),出库日期   datetime,产品编号   char(3),数量   int)  
  insert   ck   select   'C001','2004-01-02','001',50  
  union   all   select   'C002','2004-01-03','001',100  
  union   all   select   'C002','2004-01-03','001',100  
  union   all   select   'C002','2004-01-03','001',50  
  go  
   
  --查询  
  select   a.入库编号,a.入库日期,a.产品编号  
  ,数量=case  
  when   b.数量   is   null  
  then   a.数量  
  when   a.累计数量<=b.数量  
  then   0  
  when   a.累计数量-a.数量>b.数量  
  then   a.数量  
  else   a.累计数量-b.数量  
  end  
  from(  
  select   入库编号,入库日期,产品编号,数量=sum(数量)  
  ,累计数量=(  
  select   sum(数量)   from   rk  
  where   产品编号=a.产品编号   and(  
  入库日期<a.入库日期  
  or   入库日期=a.入库日期   and   入库编号<=a.入库编号))  
  from   rk   a  
  group   by   入库编号,入库日期,产品编号  
  )a   left   join(  
  select   产品编号,数量=sum(数量)  
  from   ck  
  group   by   产品编号  
  )b   on   a.产品编号=b.产品编号  
  go  
   
  --删除测试  
  drop   table   ck,rk  
   
  /*--测试结果  
   
  入库编号       入库日期                                       产品编号       数量          
  ---------   --------------------------   ---------   --------  
  r001             2004-01-01   00:00:00.000         001               0  
  r002             2004-01-02   00:00:00.000         001               0  
  r003             2004-01-03   00:00:00.000         001               90  
  r004             2004-01-03   00:00:00.000         001               100  
  r005             2004-01-03   00:00:00.000         002               100  
   
  (所影响的行数为   5   行)  
  --*/Top

21 楼zjcxc(邹建)回复于 2004-09-04 21:39:25 得分 0

把问题想复杂化了.   其实没有那么复杂(原来想成出明细清单了)Top

22 楼SuperFC(●捡分e族●)回复于 2004-09-04 22:34:57 得分 0

累计数量=(  
  select   sum(数量)   from   rk  
  where   产品编号=a.产品编号   and(  
  入库日期<a.入库日期  
  or   入库日期=a.入库日期         --这里的到底是先执行or和下面的and的优先级不太明天老大讲解一下啊  
                                                                                            and   入库编号<=a.入库编号)) Top

23 楼zhangzs8896(小二)回复于 2004-09-05 08:09:19 得分 0

老大就是老大!^_^Top

24 楼731DBA(宝)回复于 2004-09-05 15:14:42 得分 0

upTop

25 楼HWHuang()回复于 2004-09-05 15:30:58 得分 0

学习一下!Top

26 楼ice_viking()回复于 2004-09-05 20:18:44 得分 0

初学者我建议先从j2se开始学!Top

27 楼ice_viking()回复于 2004-09-05 20:30:50 得分 0

晕死!发错了1Top

相关问题

  • 求SQL语句
  • sql语句。
  • sql语句?
  • sql 语句?
  • 求SQL语句
  • ***求SQL语句***
  • sql语句??
  • sql语句
  • sql语句
  • SQL语句

关键词

  • 语句
  • 先进
  • 查询
  • 数据
  • 测试
  • 入库
  • 出库
  • 数量
  • rk
  • 编号

得分解答快速导航

  • 帖主:ibenben
  • yesterday2000
  • zheninchangjiang
  • zhangzs8896
  • zjcxc

相关链接

  • SQL Server类图书

广告也精彩

反馈

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