求SQL语句??
数据库里面主要有两个表,结构如下:
入库表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




