CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VB >  数据库(包含打印,安装,报表)

◆求一综合性很强的SQL语句

楼主cwm545(罪人)2005-06-02 14:58:15 在 VB / 数据库(包含打印,安装,报表) 提问

数据库有以下字段:  
  入库表:(vdate入库日期,nb为物料编号,name为物料名称,amount为入库数量)  
  vdate                 nb                   name               amount  
  2005-04-01       001                 原珠笔           1000  
  2005-05-01       002                 水性笔           3000  
  2005-05-01       001                 原珠笔           2000  
   
  出库表:(odate出库日期,nb为物料编号,name为物料名称,amount出库数量)  
  odate                 nb                   name                 amount  
  2005-04-01       001                 原珠笔             100  
  2005-05-01       002                 水性笔             100  
  2005-05-02       001                 原珠笔             200  
   
  现在想求出2005年5月1日至2005年5月30日的库存表:  
  (综合性很强的罗!)详细如下:  
  注:  
  上次库存是(2005年5月1日以前的入库数量)-(2005年5月1日以前的出库数量)  
  本月入库是(2005年5月1日至2005年5月30日的入库数量)  
  本月出库是(2005年5月1日至2005年5月30日的出库数量)  
  还剩库存是(上次库存+本月入库-本月出库)  
   
  物料编号       物料名称     上次库存       本月入库     本月出库     还剩库存  
  001                 原珠笔           900                   2000               200             2700  
  002                 水性笔           0                       3000               100             2900  
   
   
  帮忙一下,谢谢。。。 问题点数:50、回复次数:46Top

1 楼icedut(冰-装修进行中)回复于 2005-06-02 15:14:22 得分 35

可以考虑增加一个库存表,用于存放上次的盘点库存  
   
  Top

2 楼cwm545(罪人)回复于 2005-06-02 15:18:38 得分 0

我觉得用SQL可以直接算出。。  
  那位,来一句。。谢谢!Top

3 楼icedut(冰-装修进行中)回复于 2005-06-02 15:30:18 得分 0

是可以指结算  
  如果数据量大  
  效率是要考虑的阿  
   
  楼主再不把建表信息,贴上来,我给你写语句  
  Top

4 楼cwm545(罪人)回复于 2005-06-02 15:33:44 得分 0

呵呵,谢谢楼上的。  
  我上面不是全贴了,基本已经很详细了。Top

5 楼icedut(冰-装修进行中)回复于 2005-06-02 15:33:58 得分 0

其实本月的进出,你应该很容易得到的  
   
  某个时间点的库存:之前的所有进货-出货  
  Top

6 楼icedut(冰-装修进行中)回复于 2005-06-02 15:38:28 得分 0

你是贴全了  
  我岂不是还要在sql   server里面  
   
  create   table...  
  insert   into   table...  
  这个很烦的阿Top

7 楼icedut(冰-装修进行中)回复于 2005-06-02 15:40:41 得分 0

其实本月的进出,你应该很容易得到的  
   
  某个时间点的库存:之前的所有进货-出货  
   
  你这么想,自己都能写出来的Top

8 楼cwm545(罪人)回复于 2005-06-02 15:52:35 得分 0

谢谢你连发三贴。  
  我就是对JOIN不熟啊。。  
  期待中!Top

9 楼vbman2003(家人)回复于 2005-06-02 15:54:45 得分 15

别的不说,这两张表完全可以合并为一张表,加一个标识入出库的字段就可了。或者干脆用正负数表示入出库数量,是不是比现在更有效率?  
  Top

10 楼icedut(冰-装修进行中)回复于 2005-06-02 15:56:32 得分 0

什么数据库阿  
   
  楼主难道不能把create   table  
  insert   into  
  贴出来么  
  Top

11 楼cwm545(罪人)回复于 2005-06-02 15:57:33 得分 0

家人,谢谢你。  
  这两张表的结枸不一致的。Top

12 楼icedut(冰-装修进行中)回复于 2005-06-02 16:00:00 得分 0

还应该加一个  
  产品编码表  
          原珠笔     --这种内容最好不要出现在进出库德表中Top

13 楼vbman2003(家人)回复于 2005-06-02 16:01:56 得分 0

没时间帮你写,你可以用笨方法,分别建三个视图:  
   
  上次库存(2005年5月1日以前的入库数量)-(2005年5月1日以前的出库数量)  
  本月入库(2005年5月1日至2005年5月30日的入库数量)  
  本月出库(2005年5月1日至2005年5月30日的出库数量)  
   
  然后,关联以上三个查询做一个汇总查询就可了。Top

14 楼cwm545(罪人)回复于 2005-06-02 16:04:27 得分 0

建视图,再查询。  
  晕,我都没试过。。Top

15 楼icedut(冰-装修进行中)回复于 2005-06-02 16:06:15 得分 0

楼主什么数据库阿  
  Top

16 楼vbman2003(家人)回复于 2005-06-02 16:08:02 得分 0

icedut(冰)   说的没错,你现在的表是多对多关系。我想这样实现起来简单一点Top

17 楼icedut(冰-装修进行中)回复于 2005-06-02 16:08:02 得分 0

和楼主说话真是累啊  
  我还是歇会吧Top

18 楼cwm545(罪人)回复于 2005-06-02 16:11:58 得分 0

谢谢两位。  
  SQL   SERVER2000的  
  Top

19 楼icedut(冰-装修进行中)回复于 2005-06-02 16:12:42 得分 0

create   table   tmp_input(vdate   datetime,nd   varchar(20),name   varchar(20),amount   int   )  
  create   table   tmp_output(vdate   datetime,nd   varchar(20),name   varchar(20),amount   int   )  
   
  insert   into   tmp_input  
  select   '2005-04-01','001','原珠笔',1000  
  union  
  select   '2005-05-01','002','水性笔',   3000  
  union  
  select   '2005-05-01','001','原珠笔',   2000  
   
  insert   into   tmp_output  
  select   '2005-04-01','001','原珠笔',100  
  union  
  select   '2005-05-01','002','水性笔',100  
  union  
  select   '2005-05-02','001','原珠笔',200  
   
  --某一个时间点的库存  
  select   nd,name,sum(case   type   when   'in'   then   amount   else   0   end)-sum(case   type   when   'out'   then   amount   else   0   end)  
  from    
  (  
  select   nd,name,vdate,amount,'in'   as   Type   from   tmp_input  
  union    
  select   nd,name,vdate,amount,'out'   as   type   from   tmp_output  
  )  
  a   where   vdate<='2005-05-30'  
  group   by   nd,nameTop

20 楼icedut(冰-装修进行中)回复于 2005-06-02 16:14:58 得分 0

和楼主说话太累  
   
  我就写着写了  
  剩下的你自己慢慢写吧Top

21 楼vbman2003(家人)回复于 2005-06-02 16:16:30 得分 0

你现在会有一个问题  
  就是一个产品本月入库表中有,出库表中没有,或者上个月有这个月没有,等等类似这样的情况  
  所以要象   icedut(冰)   所说的,要有一个产品表来解决这样的问题Top

22 楼cwm545(罪人)回复于 2005-06-02 16:18:27 得分 0

高手啊,这么快。  
  select   nd,name,vdate,amount,'in'   as   Type   from   tmp_input  
  'in'   as   Type   是什么东东啊?Top

23 楼vbman2003(家人)回复于 2005-06-02 16:23:21 得分 0

通俗地说查询后多出一列别名为Type,内容是in,应该是表示入库的意思吧Top

24 楼icedut(冰-装修进行中)回复于 2005-06-02 16:24:05 得分 0

用in   表示入库  
  type   表示类型列  
   
  as   type       相当于生成一个列名为type的列Top

25 楼icedut(冰-装修进行中)回复于 2005-06-02 16:26:13 得分 0

如果数据量大  
  最好加一个库存表  
   
  不然速度可是很慢的Top

26 楼cwm545(罪人)回复于 2005-06-02 16:39:19 得分 0

谢谢。  
  等下,我两张表的结构不一样,这样用UNION好像不行吧?Top

27 楼icedut(冰-装修进行中)回复于 2005-06-02 16:49:05 得分 0

谢谢。  
  等下,我两张表的结构不一样,这样用UNION好像不行吧?  
   
  --  
  我取得字段结构是一样的不就行了么Top

28 楼cwm545(罪人)回复于 2005-06-02 17:00:38 得分 0

好的,谢谢你们。  
  我等下测试一下,有什么情况再通知你们。  
  Top

29 楼cxbkkk(本命年,旺啊!)回复于 2005-06-02 23:21:59 得分 0

和我这几天帮人做的差不多,你应该还有一个库存表吧。这样就可以很容易操作了,而且这样打印入库,出库也很方便啊,我做库存管理建了4个表,出入,库存,用户,你要查库存就直接来比较就是了,或者通过filter来实现都可以,不需要那么麻烦的,而且效率提高Top

30 楼cwm545(罪人)回复于 2005-06-03 11:35:56 得分 0

--某一个时间点的库存  
  select   nd,name,sum(case   type   when   'in'   then   amount   else   0   end)-sum(case   type   when   'out'   then   amount   else   0   end)  
  from    
  (  
  select   nd,name,vdate,amount,'in'   as   Type   from   tmp_input  
  union    
  select   nd,name,vdate,amount,'out'   as   type   from   tmp_output  
  )  
  a   where   vdate<='2005-05-30'  
  group   by   nd,name  
   
  不行啊,这只能仅仅是库存。。。  
  能不能一步到位就有:  
  物料编号       物料名称     上次库存       本月入库     本月出库     还剩库存  
   
  谢谢你。。Top

31 楼flyingscv(zlj)回复于 2005-06-03 12:45:47 得分 0

select   a.物料编号       a.物料名称     a,上次库存       b.本月入库     b.本月出库     c.还剩库存   from  
  ....  
  where   a.物料编号   =b.物料编号   and     a.物料编号   =c.物料编号Top

32 楼flyingscv(zlj)回复于 2005-06-03 12:46:07 得分 0

select   a.物料编号       a.物料名称     a,上次库存       b.本月入库     b.本月出库     c.还剩库存   from  
  ....  
  where   a.物料编号   =b.物料编号   and     a.物料编号   =c.物料编号Top

33 楼cwm545(罪人)回复于 2005-06-03 13:05:27 得分 0

我晕。。  
  这不行啊。Top

34 楼cwm545(罪人)回复于 2005-06-03 15:46:13 得分 0

惨啊,再搞不定,我5月份的库存就算不出了。。  
  那位能帮我一下。。  
   
  Top

35 楼icedut(冰-装修进行中)回复于 2005-06-03 16:03:23 得分 0

5月的库存你不是可以知道么  
  同样4月末的库存也可以知道阿  
   
  本月进出也不难啊  
   
  大家都觉得太烦了,而不愿意写啊Top

36 楼icedut(冰-装修进行中)回复于 2005-06-03 16:15:19 得分 0

select   nd,name,sum(amount)   as   InQty    
  from   tmp_input  
  where       vdate>='2005-05-01'   and   vdate<='2005-05-31'                 --本月入  
  group   by   nd,name  
   
  select   nd,name,sum(amount)   as   OutQty    
  from   tmp_output  
  where       vdate>='2005-05-01'   and   vdate<='2005-05-31'                 --本月出  
  group   by   nd,nameTop

37 楼cwm545(罪人)回复于 2005-06-03 16:16:06 得分 0

呵呵,你来了。  
  不行啊,我觉得如果能用SQL语句一步取出来,这是最好的。  
  不然太多事了。Top

38 楼icedut(冰-装修进行中)回复于 2005-06-03 16:19:24 得分 0

--没有上月库存,写得好麻烦啊,谁有好的给写写  
  select   d.nd,d.name,d.Stock,e.inQty,f.outqty  
  from   (  
  select   nd,name,  
  sum(case   type   when   'in'   then   amount   else   0   end)-sum(case   type   when   'out'   then   amount   else   0   end)   as   Stock  
  from    
  (  
  select   nd,name,vdate,amount,'in'   as   Type   from   tmp_input  
  union    
  select   nd,name,vdate,amount,'out'   as   type   from   tmp_output  
  )  
  a   where   vdate<='2005-05-30'  
  group   by   nd,name  
  )   d  
  left   outer   join  
  (  
  select   nd,name,sum(amount)   as   InQty    
  from   tmp_input  
  where       vdate>='2005-05-01'   and   vdate<='2005-05-31'  
  group   by   nd,name  
  )   e   on   d.nd=e.nd  
  left   outer   join    
  (  
  select   nd,name,sum(amount)   as   OutQty    
  from   tmp_output  
  where       vdate>='2005-05-01'   and   vdate<='2005-05-31'  
  group   by   nd,name  
  )f   on   d.nd=f.ndTop

39 楼icedut(冰-装修进行中)回复于 2005-06-03 16:22:53 得分 0

楼主,这样的效率肯定很差  
  select   d.nd,d.name,d.Stock,e.inQty,f.outqty,g.stock   as   PrevStock  
  from   (  
  select   nd,name,  
  sum(case   type   when   'in'   then   amount   else   0   end)-sum(case   type   when   'out'   then   amount   else   0   end)   as   Stock  
  from    
  (  
  select   nd,name,vdate,amount,'in'   as   Type   from   tmp_input  
  union    
  select   nd,name,vdate,amount,'out'   as   type   from   tmp_output  
  )  
  a   where   vdate<='2005-05-30'  
  group   by   nd,name  
  )   d  
  left   outer   join  
  (  
  select   nd,name,sum(amount)   as   InQty    
  from   tmp_input  
  where       vdate>='2005-05-01'   and   vdate<='2005-05-31'  
  group   by   nd,name  
  )   e   on   d.nd=e.nd  
  left   outer   join    
  (  
  select   nd,name,sum(amount)   as   OutQty    
  from   tmp_output  
  where       vdate>='2005-05-01'   and   vdate<='2005-05-31'  
  group   by   nd,name  
  )f   on   d.nd=f.nd  
   
  left   outer   join  
  (  
  select   nd,name,  
  sum(case   type   when   'in'   then   amount   else   0   end)-sum(case   type   when   'out'   then   amount   else   0   end)   as   Stock  
  from    
  (  
  select   nd,name,vdate,amount,'in'   as   Type   from   tmp_input  
  union    
  select   nd,name,vdate,amount,'out'   as   type   from   tmp_output  
  )  
  g1   where   vdate<='2005-04-30'  
  group   by   nd,name  
  )   g  
  on   d.nd=g.ndTop

40 楼icedut(冰-装修进行中)回复于 2005-06-03 16:24:20 得分 0

楼主最好加一个盘点表,用于存放上一次的盘点,这样运算量就不会很大了,应该会快一些  
  再加一个产品表  
  Top

41 楼cwm545(罪人)回复于 2005-06-03 16:40:03 得分 0

好强啊。  
  icedut,谢谢你,按照你的代码,我先研究一下去。。Top

42 楼qscandwh(思成)回复于 2005-06-03 16:49:05 得分 0

帮你顶,我也在写进销存的东东,刚开始达建枢架,希望交流  
  MSN:   qscandwh@msn.com  
  Top

43 楼xusongping(康缘)回复于 2005-06-03 17:33:00 得分 0

看得出,各位都是专家,在下有礼了!  
   
  txtSQL   =   "select   *   from   sufferExpand   where   [time]   between   #   2001-01-01#   and   #2005-06-03#   "  
  我是一个VB初学者,  
  请教怎样写一个的语句,使用变量代替语句中的日期?Top

44 楼flyingscv(zlj)回复于 2005-06-03 17:55:14 得分 0

"select   *   from   sufferExpand   where   [time]   between   #"   &   变量1   &   "#   and   #"   &   变量2   &   "#   "  
  Top

45 楼xusongping(康缘)回复于 2005-06-03 18:23:14 得分 0

有没有专家在线呀  
  帮忙解决一下吗?求求你们了  
   
  Top

46 楼xusongping(康缘)回复于 2005-06-03 18:40:38 得分 0

感谢专家的帮忙,在下不胜感谢Top

相关问题

  • ◆求一综合性较强的SQL语句
  • ◆求一综合性较强的SQL语句续。。
  • 求SQL语句
  • sql语句。
  • sql语句?
  • sql 语句?
  • 求SQL语句
  • ***求SQL语句***
  • sql语句??
  • sql语句

关键词

  • sql
  • 2005年5月1日
  • 出库
  • vdate
  • 入库
  • 库存
  • 2005年5月30日
  • unionselect
  • 物料
  • 原珠笔

得分解答快速导航

  • 帖主:cwm545
  • icedut
  • vbman2003

相关链接

  • Visual Basic类图书
  • Visual Basic类源码下载

广告也精彩

反馈

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