select a.入库编号*, a.入库日期,a.产品编号, 数量=(a.数量-b.数量) from rk a left join ck b on a.入库编号*=b.出库编号*,
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.出库编号
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.出库编号
老是写错! 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 200
我想的先进先出,是在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 200
--我想的先进先出,是在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
--测试--测试数据 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',100create 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 行) --*/
累计数量=( select sum(数量) from rk where 产品编号=a.产品编号 and( 入库日期<a.入库日期 or 入库日期=a.入库日期 --这里的到底是先执行or和下面的and的优先级不太明天老大讲解一下啊 and 入库编号<=a.入库编号))
是
from rk(*),ck不知道行不行
大家指教
数量=(a.数量-b.数量)
from rk a left join ck b on a.入库编号*=b.出库编号*,
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.出库编号
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.出库编号
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 200
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 200
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
最先入库(按入库的日期)的那批先出库呀!!
另外,上面的‘出库编号’和‘入库编号’只是个关键字而以,没有别的意义!!再举个例子吧:
入库表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语句能实现吗??
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',100create 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 行)
--*/
select sum(数量) from rk
where 产品编号=a.产品编号 and(
入库日期<a.入库日期
or 入库日期=a.入库日期 --这里的到底是先执行or和下面的and的优先级不太明天老大讲解一下啊
and 入库编号<=a.入库编号))