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

还是没有解决,请教邹建大哥吧,如果这样的问题不是sql所能完成的,我就告诉boss,更改需求吧!

楼主fzhy_aaa()2006-10-18 13:59:07 在 MS-SQL Server / 疑难问题 提问

create   table   t  
  (  
  id   int   identity(1,1),  
  类别   varchar(20),  
  名称   varchar(20),  
  长度   int,  
  宽度   int,  
  单位   varchar(10),  
  价格   decimal(9,2),  
  数量   int,  
  日期   datetime,  
  状态   char(1)--1=入库,0=出库  
  )  
  --插入记录  
  /*在2006-10-1这一天入库了宽度是2米,长度是200米的涤纶10卷,价格是20元/米*/  
  insert   into   t   select'布匹','涤纶',200,2,'卷',20,10,'2006-10-1','1'  
  /*在2006-10-1这一天出库了宽度是2米,长度是50米的涤纶1卷,价格是20元/米*/  
  union   all   select'布匹','涤纶',50,2,'卷',20,1,'2006-10-2','0'  
  /*  
  要得到以下报表  
  类别     名称       剩余长度           宽度         单位       价格       剩余数量         日期    
  布匹     涤纶           200                   2             卷           20               10           2006-10-1  
  布匹     涤纶           150                   2             卷           20                 1           2006-10-2                  
  布匹     涤纶           200                   2             卷           20                 9           2006-10-2  
  */  
   
  drop   table   t  
  --------------------------------------------------------------------------------------  
   
  数据库说明:状态   char(1) 1代表入库,0代表出库  
   
  业务说明:  
   
  库存没有期初数  
   
  商店在2006-10-1这天进货了10卷布,每卷布的长度是200米,那么2006-10-1这天的库存为10卷  
  每卷的长度是200米  
   
  2006-10-2在其中一卷布上销售了50米,那么2006-10-2这天的剩余库存为,长度是200米的布匹9卷,长度是150米的布匹是1卷  
   
  这是按日期计算库存的结余数,如果2006-10-1没有出库的话,那库存的结余就是它的入库数  
  问题点数:10、回复次数:33Top

1 楼qw12cn()回复于 2006-10-18 14:48:25 得分 0

好象不行。  
  如果你3日再出库50米,你怎么确定是减150M的,还是200M的。  
  和实际库存很可能出现差别。  
  Top

2 楼fzhy_aaa()回复于 2006-10-18 14:53:59 得分 0

qw12cn()   (   )    
  --------------  
  一般情况下都是整卷的批发,偶尔出库不到一卷的情况,就按照米数来计算.而且仅仅局限于一卷的范围内  
   
  如果你3日再出库50米,你怎么确定是减150M的,还是200M的。  
  和实际库存很可能出现差别。  
  这种情况列出2日库存结余,让用户进行选择,就是这样  
   
  类别     名称       剩余长度           宽度         单位       价格       剩余数量         日期    
  布匹     涤纶           200                   2             卷           20               10           2006-10-1  
  布匹     涤纶           150                   2             卷           20                 1           2006-10-2                  
  布匹     涤纶           200                   2             卷           20                 9           2006-10-2  
   
  这也是要得到的结果  
  Top

3 楼liangfei1983(我是杀人不眨眼,眨眼不杀人的恶魔!哈哈,怕了吧,不怕,我亲死你!!!)回复于 2006-10-18 15:02:41 得分 0

说实话,没太看懂业务逻辑!!!Top

4 楼fzhy_aaa()回复于 2006-10-18 15:10:41 得分 0

liangfei1983(lliangfei)  
  ---------------------  
  其实,就是批发业务.如果是第一次入库,入库了10卷,每卷长度是200米,那么库存数就是10卷  
  每卷长200米.现在出库了50米,只能从其中一卷裁掉50米出库,那么剩余库存为:  
   
  长度200米的9卷  
  长度150米的1卷Top

5 楼bjgzxx(食人一族)回复于 2006-10-18 15:11:57 得分 0

我也是没看懂怎么回事   要实现什么功能   给的条件都没有   就让我们大家猜Top

6 楼liangfei1983(我是杀人不眨眼,眨眼不杀人的恶魔!哈哈,怕了吧,不怕,我亲死你!!!)回复于 2006-10-18 15:19:05 得分 0

我现在看懂的,也有点头绪,但我编的可能会比较复杂!!!要涉及到循环去哒  
  不能用一条语句搞定啊!!!Top

7 楼fzhy_aaa()回复于 2006-10-18 15:20:22 得分 0

liangfei1983(lliangfei)   (   )  
  ---------------------------  
  多谢了,循环也可以啊,怎样写呢?Top

8 楼bjgzxx(食人一族)回复于 2006-10-18 15:58:19 得分 0

liangqingzhi(老之)  
     
     
        建议使用DBComboBox和DBEdit,会方便很多。  
  这个建议好但是控制起来不方便Top

9 楼bjgzxx(食人一族)回复于 2006-10-18 15:58:55 得分 0

上面的发错了Top

10 楼fcuandy(了此残生.)回复于 2006-10-18 16:05:13 得分 0

意思我看明白了,用游标或循环做的话还是比较简单的.  
  我想想不用循环的做法.Top

11 楼fzhy_aaa()回复于 2006-10-18 16:06:57 得分 0

fcuandy(长翅膀的不一定是天使,也可能是鸟人)  
   
  谢谢了.Top

12 楼fcuandy(了此残生.)回复于 2006-10-18 16:36:52 得分 0

create   table   t  
  (  
  id   int   identity(1,1),  
  类别   varchar(20),  
  名称   varchar(20),  
  长度   int,  
  宽度   int,  
  单位   varchar(10),  
  价格   decimal(9,2),  
  数量   int,  
  日期   datetime,  
  状态   char(1)--1=入库,0=出库  
  )  
   
  insert   into   t   select'布匹','涤纶',200,2,'卷',20,10,'2006-10-1','1'  
  union   all   select'布匹','涤纶',50,2,'卷',20,1,'2006-10-2','0'  
  union   all   select'布匹','涤纶',120,3,'卷',20,2,'2006-10-2','0'  
  union   all   select'布匹','涤纶',250,3,'卷',20,2,'2006-10-3','1'  
   
  declare   @len   int  
  set   @len=200  
  select   id,类别,名称,长度,宽度,单位,价格,数量,数量*长度   currentlen,状态,日期,  
  (select   sum((case   when   状态=0   then   -1   else   1   end)*数量*长度)   from   t   where   t.id<=a.id)   as   allen     into   #   from   t   a  
  select   id,类别,名称,长度,宽度,单位,价格,allen/@len   数量,状态,日期   from   #   where   状态=1  
  union   all  
  select   id,类别,名称,@len,宽度,单位,价格,allen/@len,状态,日期     from   #   where   状态=0  
  union   all  
  select   id,类别,名称,allen%@len,宽度,单位,价格,case   when   状态=1   then   allen/@len   else   1   end,状态,日期     from   #   where   allen%@len<>0   and   状态=0  
  union    
  select   id,类别,名称,长度,宽度,单位,价格,数量,状态,日期     from   #   where   状态=1  
  order   by   日期,id,数量  
   
  drop   table   t,#  
   
  /*  
  1 布匹 涤纶 200 2 卷 20.00 10 1 2006-10-01   00:00:00.000  
  2 布匹 涤纶 150 2 卷 20.00 1 0 2006-10-02   00:00:00.000  
  2 布匹 涤纶 200 2 卷 20.00 9 0 2006-10-02   00:00:00.000  
  3 布匹 涤纶 110 3 卷 20.00 1 0 2006-10-02   00:00:00.000  
  3 布匹 涤纶 200 3 卷 20.00 8 0 2006-10-02   00:00:00.000  
  4 布匹 涤纶 250 3 卷 20.00 2 1 2006-10-03   00:00:00.000  
  4 布匹 涤纶 250 3 卷 20.00 11 1 2006-10-03   00:00:00.000  
  */  
   
  为了写查询语句方便我用了临时表.  
  语句逻辑没有细想,可能会有bugTop

13 楼fzhy_aaa()回复于 2006-10-18 16:43:29 得分 0

fcuandy(长翅膀的不一定是天使,也可能是鸟人)  
   
  再次感谢,我试一下Top

14 楼fzhy_aaa()回复于 2006-10-18 16:47:42 得分 0

fcuandy(长翅膀的不一定是天使,也可能是鸟人)  
   
  有个小问题,如果按照日期进行查询的话,应该把条件写在什么位置上?Top

15 楼fcuandy(了此残生.)回复于 2006-10-18 16:53:27 得分 0

select   id,类别,名称,长度,宽度,单位,价格,数量,数量*长度   currentlen,状态,日期,  
  (select   sum((case   when   状态=0   then   -1   else   1   end)*数量*长度)   from   t   where   t.id<=a.id   and   日期...)   as   allen     into   #   from   t   a   where   日期...  
   
  在这两个地方加就可以了.  
   
  忽略了一点,进货如果布长度超过200,这个又怎么算?比如   240...   如果实际上进的都是200的那就不存在这个问题.Top

16 楼fzhy_aaa()回复于 2006-10-18 17:07:22 得分 0

忽略了一点,进货如果布长度超过200,这个又怎么算?比如   240...   如果实际上进的都是200的那就不存在这个问题.  
  ------------------------------------------  
  是这样进货的,有可能进两批,一批是长度是200,另一批长度是300,这时候会有影响吗?是否按照长度来分组,另外也有这种情况,进两批,但是价格不同,是否也应该按照价格来分组Top

17 楼fzhy_aaa()回复于 2006-10-18 17:10:01 得分 0

我觉得的按照"类别","名称","长度","宽度","价格"来分组,这样才能做到通用化.  
   
  能否把sql改写成这样?Top

18 楼fcuandy(了此残生.)回复于 2006-10-18 17:17:05 得分 0

你这个分组好似没有意义.分组用于汇总,统计之类的.而看你的要求,应该是要某类商品的库存明细历史记录.   一次查出所有物品的明细历史记录做也是可以做到的,不过复杂程度高多了.Top

19 楼fzhy_aaa()回复于 2006-10-18 17:26:45 得分 0

fcuandy(长翅膀的不一定是天使,也可能是鸟人)  
   
  这样的明细帐也能出来,真是好厉害  
  ---------------------------  
  我要分组的原因,是考虑到有别的种类,比如"绸缎",下面有名称"丝绸"等.另外还有同一种布匹,价格不同的情况  
   
   
  Top

20 楼fzhy_aaa()回复于 2006-10-18 17:28:58 得分 0

看你的要求,应该是要某类商品的库存明细历史记录.  
  -------------------------------  
  要求是得到当天的库存结余数.这样在前台程序中,就可以列出一个列表,让库管选择一下库存的结余商品,进行出库操作Top

21 楼liangfei1983(我是杀人不眨眼,眨眼不杀人的恶魔!哈哈,怕了吧,不怕,我亲死你!!!)回复于 2006-10-18 17:37:59 得分 0

按照你的要求,这条SQL语句,我认为将为是非常麻烦的!!!!因为要考虑的东西太多哒!!!  
  Top

22 楼fzhy_aaa()回复于 2006-10-18 17:40:25 得分 0

liangfei1983(lliangfei)  
  -----------------------------------  
  是好麻烦啊,难度不小.Top

23 楼netcup(茶杯)回复于 2006-10-18 18:10:45 得分 0

这个问题不难,和我过去的一个要求差不多,你的200米应该是一个规格吧?Top

24 楼exinke(新克)回复于 2006-10-19 08:24:59 得分 0

表结构中再加上一列:   InID   int,   记录是哪笔入库的记录,状态char(1)=0时用;  
  这样查询应该可以写的出来  
  学习中……Top

25 楼fzhy_aaa()回复于 2006-10-19 09:13:58 得分 0

fcuandy(长翅膀的不一定是天使,也可能是鸟人)    
  ---------------------------------------------------------------  
  有个问题:  
  如果把入库记录改写成这样  
  insert   into   t   select'布匹','涤纶',200,2,'卷',20,10,'2006-10-1','1'  
  union   all   select'布匹','涤纶',200,2,'卷',20,10,'2006-10-1','1'  
  那么结果为:  
  布匹 涤纶 200 2 卷 20.00 10 1 2006-10-01    
  布匹 涤纶 200 2 卷 20.00 10 1 2006-10-01   布匹 涤纶 200 2 卷 20.00 20 1 2006-10-01   -----------------------------------------  
  而要得到的结果为:  
  布匹 涤纶 200 2 卷 20.00 20 1 2006-10-01    
   
  以上情况就是,只有入库操作,没有出库操作的情况下,库存结余数是20  
   
   
   
   
  Top

26 楼fzhy_aaa()回复于 2006-10-19 09:15:18 得分 0

netcup(茶杯)    
  ----------------------------------  
  对,200米是一个规格,你有这样方面的经验吗,告诉我怎么做可以吗Top

27 楼cai114(硬鸡常空(KingKong归来))回复于 2006-10-19 10:11:23 得分 0

是否可以这样?将物料编码写成动态的?200为手输,如果卖出50米物料编码就变成150  
          我是做毛线的,不认同者还请指教Top

28 楼fzhy_aaa()回复于 2006-10-19 10:29:18 得分 0

将物料编码写成动态的?200为手输  
  ---------------------  
  是指出库还是入库?Top

29 楼hznxcgh2006()回复于 2006-10-19 11:43:10 得分 0

不錯,都是高手,學習中。。。。Top

30 楼netcup(茶杯)回复于 2006-10-19 17:35:16 得分 0

若是规格,那就看能否被取模作为拆零的依据.我回去翻下资料Top

31 楼prcgolf(小鸟)回复于 2006-10-27 11:59:19 得分 0

upTop

32 楼StarRains(星雨)回复于 2006-10-27 13:05:09 得分 0

数据结构的设计是不是应该改进一下,就像二楼说的:  
  如果你3日再出库50米,你怎么确定是减150M的,还是200M的。  
  和实际库存很可能出现差别Top

33 楼xchd545(男才女貌?男财女貌?男财女毛?!)回复于 2006-10-27 13:37:49 得分 0

高手真多,Top

相关问题

关键词

得分解答快速导航

  • 帖主:fzhy_aaa

相关链接

  • SQL Server类图书

广告也精彩

反馈

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