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

高分紧急求救sql数据库问题!!!!回答者有分!

楼主liu34300220(tianya)2004-12-02 00:03:59 在 MS-SQL Server / 应用实例 提问

创建表:  
  CREATE   TABLE   入库表{  
  物品ID INT NOT   NULL  
  入库数量 INT NULL,  
  入库时间 DATETIME NULL  
  }  
  CREATE   TABLE   出库表{  
  物品ID INT NOT   NULL,  
  出库数量 INT NULL,  
  出库时间 DATETIME NULL  
  }  
  CREATE   TABLE   库存台帐数据表{  
  物品ID     INT NOT   NULL,  
  月初结存数   INT NULL,  
  月末结存数   INT NULL,  
  结存年份     INT NOT   NULL,  
  结存月份     INT         NOT   NULL  
  }  
   
  利用入库表和出库表的入出库数据重新生成库存台帐数据表的库存台帐数据(以下数据为举例数据)  
   
  入库表数据:  
  物品ID 入库数量 入库时间  
  100 10 2004.1.1  
  200 20 2004.1.1  
  300 50 2004.2.1  
   
  出库表数据:  
  物品ID 出库数量 出库时间  
  100 5 2004.1.1  
  200 10 2004.1.1  
  300 20 2004.2.1  
  400 50 2004.2.1  
   
   
  T3数据:  
  物品ID 月初结存数         月末结存数 结存年份 结存月份  
  100 0               5                     2004 1  
  200 0               10                     2004 1  
  100 5               5                       2004 2  
  200 10               10                     2004 2  
  300 0               30                     2004 2  
  400 0             -50                     2004 2  
   
  谁帮帮我利用入库表和出库表的入出库数据重新生成库存台帐数据表的库存台帐数据???  
  三天后结贴!!!  
  先谢谢大哥们!!  
  问题点数:100、回复次数:21Top

1 楼jingxijun(一笑)回复于 2004-12-02 08:10:13 得分 1

同一产品可能一月内出库(入库)多次?Top

2 楼double22822(大无忧-老实和尚(有事发消息))回复于 2004-12-02 08:19:32 得分 1

先mark。晚上看Top

3 楼Frewin(frewin)回复于 2004-12-02 08:45:15 得分 15

Select   Sum(入库数量)   As   数量,Year(入库时间)as   年份,Month(入库时间)   as   月份   ,物品ID    
  Into   #tmp  
  From   入库表数据   Group   By   物品ID,Year(入库时间),Month(入库时间)  
   
  Insert   into   #tmp(数量,年份,月份,物品ID)  
  Select   (-1)*Sum(出库数量)   As   数量,Year(出库时间)as   年份,Month(出库时间)   as   月份   ,物品ID    
  Into   #tmp  
  From   出库表数据   Group   By   物品ID,Year(出库时间),Month(出库时间)  
   
  Select   物品ID,Sum(数量)   AS   数量,年份,月份  
  From   #tmp   Group   By     物品ID,年份,月份Top

4 楼Frewin(frewin)回复于 2004-12-02 08:45:53 得分 5

Select   Sum(入库数量)   As   数量,Year(入库时间)as   年份,Month(入库时间)   as   月份   ,物品ID    
  Into   #tmp  
  From   入库表数据   Group   By   物品ID,Year(入库时间),Month(入库时间)  
   
  Insert   into   #tmp(数量,年份,月份,物品ID)  
  Select   (-1)*Sum(出库数量)   As   数量,Year(出库时间)as   年份,Month(出库时间)   as   月份   ,物品ID    
  From   出库表数据   Group   By   物品ID,Year(出库时间),Month(出库时间)  
   
  Select   物品ID,Sum(数量)   AS   数量,年份,月份  
  From   #tmp   Group   By     物品ID,年份,月份Top

5 楼zjcxc(邹建)回复于 2004-12-02 08:59:36 得分 1

楼主的结存有问题吧?   为什么  
  入库  
  300 50 2004.2.1  
  与出库  
  300 20 2004.2.1  
   
  在结存中合并,其他的不合并?Top

6 楼lzymagi(逸)回复于 2004-12-02 09:14:54 得分 1

太多眼花。顶一下Top

7 楼liu34300220(tianya)回复于 2004-12-02 10:59:14 得分 0

to:jingxijun(一笑)  
    to:lzymagi(逸)  
  这只是例子而儿!!  
  如果时间有问题可以变下!!  
  我只是要实现这种数据库表的变化的实现sql语句  
  先谢谢大哥们了!!Top

8 楼qizhanfeng(glacier)回复于 2004-12-02 11:17:56 得分 1

upTop

9 楼freetimeyun(江上渔)回复于 2004-12-02 20:41:14 得分 1

MARK一下Top

10 楼liu34300220(tianya)回复于 2004-12-02 20:45:22 得分 0

to:Frewin(Frewin)    
  大哥你可以再帮帮我做下去吗?或说说下面的步骤应该怎么做!!  
  小弟先谢谢了!!!  
   
  Top

11 楼liu34300220(tianya)回复于 2004-12-02 21:28:43 得分 0

那位大哥会啊!!  
  帮帮小弟可以吗??真的好急啊!!Top

12 楼vinsonshen(为了明天)回复于 2004-12-02 22:06:27 得分 0

呵呵,帮你顶下~~Top

13 楼mastersky(浪)回复于 2004-12-02 23:00:33 得分 70

搞了1个半小时终于给楼主搞出来了,我的思路是这样子的了,你可以根据这个思路扩展一下,或许还有更简便的方法。  
  全部代码如下:  
   
  CREATE   TABLE   入库表(  
  物品ID INT NOT   NULL,  
  入库数量 INT NULL,  
  入库时间 DATETIME NULL  
  )  
   
  CREATE   TABLE   出库表(  
  物品ID INT NOT   NULL,  
  出库数量 INT NULL,  
  出库时间 DATETIME NULL  
  )  
   
  CREATE   TABLE   库存台帐数据表(  
  物品ID     INT NOT   NULL,  
  月初结存数   INT NULL,  
  月末结存数   INT NULL,  
  结存年份     INT NOT   NULL,  
  结存月份     INT         NOT   NULL  
  )  
   
  delete   from   出库表  
  delete   from   入库表  
   
  INSERT   INTO   入库表   values(100,10,'2004-1-1')  
  INSERT   INTO   入库表   values(200,20,'2004-1-1')  
  INSERT   INTO   入库表   values(300,50,'2004-2-1')  
   
  INSERT   INTO   出库表   values(100,5,'2004-1-1')  
  INSERT   INTO   出库表   values(200,10,'2004-1-1')  
  Insert   into   出库表   values(200,2,'2004-2-1')  
  INSERT   INTO   出库表   values(300,20,'2004-2-1')  
  INSERT   INTO   出库表   values(400,50,'2004-2-1')  
   
  select   *   from   出库表  
  select   *   from   入库表  
   
  --这个临时表一定要建,如果1个月有几条数据,就必须要有自动增长字段,  
  --否则会有记录重复  
  CREATE   TABLE   #aa   (  
  I_D   [int]   IDENTITY   (1,   1)   NOT   NULL   ,  
  物品ID   INT,  
  数量   INT,  
  年   INT,  
  月   INT,  
  FLAG   INT  
  )   ON   [PRIMARY]  
  GO  
   
  --给临时表建1个索引  
  ALTER   TABLE   #aa   ADD    
  CONSTRAINT   [IX_aa]   UNIQUE     NONCLUSTERED    
  (  
  [I_D]  
  )     ON   [PRIMARY]    
  GO  
   
  --合并进出仓表  
  Insert   Into   #aa   (物品ID,   数量,   年,   月,   FLAG)    
  select   物品ID   ,入库数量   as   数量,   YEAR(入库时间)   年,   MONTH(入库时间)   月   ,FLAG=1   from   入库表  
  union  
  select   物品ID   ,出库数量   as   数量,   YEAR(出库时间)   年,   MONTH(出库时间)   月   ,FLAG=-1   from   出库表  
   
  select   *   from   #aa  
   
  --得到每个月的当月发生额  
  select   物品ID,年,月,SUM(数量*FLAG)   当月发生数     into   #bb   from   #aa   group   by   物品ID,年,月  
   
  select   *   from   #bb  
   
  --以下数据全部根据当月发生额获得。逐月递增  
  declare   @iy   int--最小年  
  declare   @ay   int--最大年  
  declare   @m   int--最小年的最小月  
  declare   @n   int--最大年的最大月  
  declare   @i   int--从最大年的最大月到最小年的最小月一共有多少个月  
  declare   @j   int--循环用  
  declare   @yy   int--当前年  
  declare   @mm   int--当前月  
  declare   @lyy   int--上月的年  
  declare   @lmm   int--上月的月  
   
  delete   from   库存台帐数据表   --删除台帐重新开始  
  select   @iy=min(年),@ay=max(年)   from   #bb  
   
  select   @iy,@ay  
   
  select   @m=min(月)   from   #bb   where   年=@iy  
  select   @m  
   
  select   @n=max(月)   from   #bb   where   年=@ay  
  select   @n  
   
  select   @i=(@ay-@iy)*12+(@n-@m)+1  
   
  select   @i--得到要算台帐的月数  
   
  --初始化  
  select   @j=1  
  select   @yy=@iy  
  select   @mm=@m  
  select   @lmm=@mm-1  
  if   @lmm=0    
      begin  
          select   @lmm=12  
          select   @lyy=@yy-1  
      end  
  else   select   @lyy=@yy  
   
  --循环开始  
  while   @j<=@i    
      begin  
  --插入上月存在的  
          insert   into   库存台帐数据表   select   a.w1,a.n1,a.n1+isnull(b.n2,0),@yy,@mm   from   (select   物品ID   w1,月末结存数   n1   from   库存台帐数据表   where   结存年份=@lyy   and   结存月份=@lmm)   a   left   outer   join   (select   物品ID   w2,当月发生数   n2,年,月   from   #bb   where   年=@yy   and   月=@mm)   b   on   a.w1=b.w2  
  --插入上月不存在的  
          insert   into   库存台帐数据表   select   物品ID,0,当月发生数,@yy,@mm   from   #bb   where   (年=@yy   and   月=@mm)   and   物品ID   not   in   (Select   物品ID   from   库存台帐数据表   where   年=@yy   and   月=@mm   )  
   
  --设置年月和循环因子  
          select   @j=@j+1  
          select   @lmm=@mm  
          select   @lyy=@yy  
          select   @mm=@mm+1  
          if   @mm=13    
          begin  
              select   @mm=1  
              select   @yy=@yy+1  
          end  
      end;  
   
  --查看结果  
  select   *   from   库存台帐数据表   order   by   结存年份,结存月份,物品ID  
   
  部分结果如下:  
   
  出库表:  
  物品ID                 出库数量                 出库时间                                                                                                        
  -----------   -----------   ------------------------------------------------------    
  100                   5                       2004-01-01   00:00:00.000  
  200                   10                     2004-01-01   00:00:00.000  
  200                   2                       2004-02-01   00:00:00.000  
  300                   20                     2004-02-01   00:00:00.000  
  400                   50                     2004-02-01   00:00:00.000  
   
  入库表:  
  物品ID                 入库数量                 入库时间                                                                                                        
  -----------   -----------   ------------------------------------------------------    
  100                   10                     2004-01-01   00:00:00.000  
  200                   20                     2004-01-01   00:00:00.000  
  300                   50                     2004-02-01   00:00:00.000  
   
  合并后的临时表:  
  I_D                   物品ID                 数量                     年                       月                       FLAG                  
  -----------   -----------   -----------   -----------   -----------   -----------    
  1                       100                   5                       2004                 1                       -1  
  2                       100                   10                     2004                 1                       1  
  3                       200                   2                       2004                 2                       -1  
  4                       200                   10                     2004                 1                       -1  
  5                       200                   20                     2004                 1                       1  
  6                       300                   20                     2004                 2                       -1  
  7                       300                   50                     2004                 2                       1  
  8                       400                   50                     2004                 2                       -1  
   
  每个月的统计结果表:  
  物品ID                 年                       月                       当月发生数                
  -----------   -----------   -----------   -----------    
  100                   2004                 1                       5  
  200                   2004                 1                       10  
  200                   2004                 2                       -2  
  300                   2004                 2                       30  
  400                   2004                 2                       -50  
   
  最终结果:台帐数据表:  
  物品ID                 月初结存数               月末结存数               结存年份                 结存月份                  
  -----------   -----------   -----------   -----------   -----------    
  100                   0                       5                       2004                 1  
  200                   0                       10                     2004                 1  
  100                   5                       5                       2004                 2  
  200                   10                     8                       2004                 2  
  300                   0                       30                     2004                 2  
  400                   0                       -50                   2004                 2Top

14 楼liu34300220(tianya)回复于 2004-12-02 23:35:38 得分 0

to:mastersky(浪)  
  谢谢你拉!!!  
  我看看怎么样!!  
  Top

15 楼prcgolf(小鸟)回复于 2004-12-03 11:00:23 得分 0

upTop

16 楼javacici(长风众山晓)回复于 2004-12-03 11:34:55 得分 1

楼上果然有强人。学习之,帮楼主顶!Top

17 楼jiang130(Hong)回复于 2004-12-03 13:31:44 得分 0

upTop

18 楼ERICLU5188(ERIC)回复于 2004-12-03 13:48:19 得分 1

眼花Top

19 楼zhang_yzy(六子儿)回复于 2004-12-03 13:57:35 得分 1

学习一下Top

20 楼vinsonshen(为了明天)回复于 2004-12-03 13:57:49 得分 1

解决了没有啊?楼主~~~Top

21 楼liu34300220(tianya)回复于 2004-12-05 12:05:14 得分 0

解决了  
  Top

相关问题

  • 回答者有分
  • 回答者有分
  • MIDAS 连接SQL数据库时应用程序服务器无响应,紧急求救,给出最高分!!!!!
  • 回答者,人人有分!
  • 回答者都有分!
  • 关于sql数据库问题?100分
  • 紧急求助关于连接SQL数据库的问题
  • 怎么给回答者分数?...-_-
  • VB+ACCESS的问题,回答者加分!!
  • 在线等待!先回答者得分!

关键词

  • 物品
  • 数据
  • 出库
  • 入库
  • 结存
  • intnull
  • 表
  • 年份
  • 月份
  • 数量

得分解答快速导航

  • 帖主:liu34300220
  • jingxijun
  • double22822
  • Frewin
  • Frewin
  • zjcxc
  • lzymagi
  • qizhanfeng
  • freetimeyun
  • mastersky
  • javacici
  • ERICLU5188
  • zhang_yzy
  • vinsonshen

相关链接

  • SQL Server类图书

广告也精彩

反馈

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