高分紧急求救sql数据库问题!!!!回答者有分!
创建表:
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




