insert into 库存表 select 'a','a1','111',10,100,'入库' insert into 库存表 select 'a','a1','111',10,100,'入库' insert into 库存表 select 'a','a1','111',20,100,'入库' -------------------------------------- declare @num int set @num=5 ---此次出库数量5 insert into 库存表 select 商品类别,商品名称,商品规格,@num ,sum((case when 库存标志='入库' then 数量 else 0 end)*单价)/sum( case when 库存标志='入库' then 数量 when 库存标志='出库' then -数量 end) as 價格 ,'出库' from 库存表 group by 商品类别,商品名称,商品规格
--------------------------------------- select * from 库存表
商品类别 商品名称 商品规格 数量 单价 库存标志 ------------------------------------------------------------ a a1 111 10 100 入库 a a1 111 10 100 入库 a a1 111 20 100 入库 a a1 111 5 100 出库
--如果再出库10的话: declare @num int set @num=10 ---再出库数量10 insert into 库存表 select 商品类别,商品名称,商品规格,@num ,sum((case when 库存标志='入库' then 数量 else 0 end)*单价)/sum( case when 库存标志='入库' then 数量 when 库存标志='出库' then -数量 end) as 價格 ,'出库' from 库存表 group by 商品类别,商品名称,商品规格 ---- select * from 库存表
商品类别 商品名称 商品规格 数量 单价 库存标志 ------------------------------------------------------------ a a1 111 10 100 入库 a a1 111 10 100 入库 a a1 111 20 100 入库 a a1 111 5 100 出库 a a1 111 10 114 出库 来源:http://topic.csdn.net/t/20060916/15/5026599.html
--库存先进先出简单例子:create table t( id int identity(1,1), name varchar(50),--商品名称 j int, --入库数量 c int, --出库数量 jdate datetime --入库时间 ) insert into t(name,j,c,jdate) select 'A',100,0,'2007-12-01' insert into t(name,j,c,jdate) select 'A',200,0,'2008-01-07' insert into t(name,j,c,jdate) select 'B',320,0,'2007-12-21' insert into t(name,j,c,jdate) select 'A',100,0,'2008-01-15' insert into t(name,j,c,jdate) select 'B',90,0,'2008-02-03' insert into t(name,j,c,jdate) select 'A',460,0,'2008-02-01' insert into t(name,j,c,jdate) select 'A',510,0,'2008-03-01' gocreate proc wsp @name varchar(50),--商品名称 @cost int --销售量 as --先得出该货物的库存是否够 declare @spare float --剩余库存 select @spare=sum(j)-sum(c) from t where name=@name if(@spare>=@cost) begin --根据入库日期采用先进先出原则对货物的库存进行处理 update t set c= case when (select @cost-isnull(sum(j),0)+isnull(sum(c),0) from t where name=@name and jdate<=a.jdate and j!=c)>=0 then a.j else case when (select @cost-isnull(sum(j),0)+isnull(sum(c),0) from t where name=@name and jdate<a.jdate and j!=c)<0 then 0 else (select @cost-isnull(sum(j),0)+isnull(sum(c),0)+a.c from t where name=@name and jdate<a.jdate and j!=c) end end from t a where name=@name and j!=c end else raiserror('库存不足',16,1) return go --测试:exec wsp @name='A',@cost=180 select * from t --drop table t --drop proc wsp
(
商品类别 varchar(50),
商品名称 varchar(50),
商品规格 varchar(50),
数量 int,
单价 int,
库存标志 char(10)
)
insert into 库存表 select 'a','a1','111',10,100,'入库'
insert into 库存表 select 'a','a1','111',10,100,'入库'
insert into 库存表 select 'a','a1','111',20,100,'入库'
--------------------------------------
declare @num int
set @num=5 ---此次出库数量5
insert into 库存表
select 商品类别,商品名称,商品规格,@num
,sum((case when 库存标志='入库' then 数量 else 0 end)*单价)/sum( case when 库存标志='入库' then 数量 when 库存标志='出库' then -数量 end) as 價格
,'出库' from 库存表
group by 商品类别,商品名称,商品规格
---------------------------------------
select * from 库存表
商品类别 商品名称 商品规格 数量 单价 库存标志
------------------------------------------------------------
a a1 111 10 100 入库
a a1 111 10 100 入库
a a1 111 20 100 入库
a a1 111 5 100 出库
--如果再出库10的话:
declare @num int
set @num=10 ---再出库数量10
insert into 库存表
select 商品类别,商品名称,商品规格,@num
,sum((case when 库存标志='入库' then 数量 else 0 end)*单价)/sum( case when 库存标志='入库' then 数量 when 库存标志='出库' then -数量 end) as 價格
,'出库' from 库存表
group by 商品类别,商品名称,商品规格
----
select * from 库存表
商品类别 商品名称 商品规格 数量 单价 库存标志
------------------------------------------------------------
a a1 111 10 100 入库
a a1 111 10 100 入库
a a1 111 20 100 入库
a a1 111 5 100 出库
a a1 111 10 114 出库
来源:http://topic.csdn.net/t/20060916/15/5026599.html
id int identity(1,1),
name varchar(50),--商品名称
j int, --入库数量
c int, --出库数量
jdate datetime --入库时间
)
insert into t(name,j,c,jdate) select 'A',100,0,'2007-12-01'
insert into t(name,j,c,jdate) select 'A',200,0,'2008-01-07'
insert into t(name,j,c,jdate) select 'B',320,0,'2007-12-21'
insert into t(name,j,c,jdate) select 'A',100,0,'2008-01-15'
insert into t(name,j,c,jdate) select 'B',90,0,'2008-02-03'
insert into t(name,j,c,jdate) select 'A',460,0,'2008-02-01'
insert into t(name,j,c,jdate) select 'A',510,0,'2008-03-01'
gocreate proc wsp
@name varchar(50),--商品名称
@cost int --销售量
as
--先得出该货物的库存是否够
declare @spare float --剩余库存
select @spare=sum(j)-sum(c) from t where name=@name
if(@spare>=@cost)
begin
--根据入库日期采用先进先出原则对货物的库存进行处理
update t set c=
case when (select @cost-isnull(sum(j),0)+isnull(sum(c),0) from t where name=@name and jdate<=a.jdate and j!=c)>=0
then a.j
else
case when (select @cost-isnull(sum(j),0)+isnull(sum(c),0) from t where name=@name and jdate<a.jdate and j!=c)<0 then 0
else (select @cost-isnull(sum(j),0)+isnull(sum(c),0)+a.c from t where name=@name and jdate<a.jdate and j!=c)
end
end
from t a where name=@name and j!=c
end
else
raiserror('库存不足',16,1)
return
go
--测试:exec wsp @name='A',@cost=180
select * from t
--drop table t
--drop proc wsp
采用全月一次加权平均法计算单价,本月结存单价、数量、金额作为下月的期初,如此类推;
根据不同的查询起始日期和结束日期有不同的结果
注意:如果是调拨单的调入单价则必须取调出单价
仓库 单号 日期 货品 数量 单价 金额 进/出仓
STORE BC BD GOODS QTY PRICE AM ISIN
原料仓 IN001 2009-07-30 A001 300 20 6000 1 --7月份
原料仓 IN002 2009-07-29 B001 400 2 800 1
原料仓 IN101 2009-08-01 A001 30 20 600 1 --8月份
原料仓 IN103 2009-08-20 A001 50 22 1100 1
原料仓 IN203 2009-08-25 A001 20 23 460 1
原料仓 IN123 2009-08-26 B001 300 2 600 1原料仓 OU100 2009-08-26 A001 30 0 0 0 --8月份出仓
原料仓 OU202 2009-08-27 B001 20 0 0 0
原料仓 OU132 2009-08-29 B001 40 0 0 0 原料仓 IN123 2009-09-01 A001 500 21 10500 1 ---9月份进仓
原料仓 IN125 2009-09-20 B001 500 2.2 1100 1
半成仓 OU129 2009-09-25 B001 23 0 0 1 ---此为调拨单 单号相同 这里没有单价原料仓 OU211 2009-09-08 A001 100 0 0 0 ---9月份出仓
原料仓 OU213 2009-09-27 B001 120 0 0 0
原料仓 OU129 2009-09-25 B001 23 0 0 0 ---此为调拨单 单号相同
求结果如下有2点:
1/第一种方案 (希望能做成函数)
(@FROMDATE DATETIME, @TODATE DATETIME) ---查询 ('2009-08-01','2009-08-31')
仓库 货品 期初数量 期初单价 期初金额 收入数量 收入单价 收入金额 发出数量 发出单价 发出金额 结存数量 结存单价 结存金额
STORE GOODS SQT SPRICE SAM IQT IPRICE IAM OQT OPRICE OAM EQT EPRICE EAM
原料仓 A001 300 20 6,000.00 100 21.6 2,160.00 70 20.4 1,428.00 330 20.4 6,732.00
原料仓 B001 400 2 800 300 2 600 20 2 40 680 2 1,360.00 (@FROMDATE DATETIME, @TODATE DATETIME) ---查询 ('2009-09-01','2009-08-30')
仓库 货品 期初数量 期初单价 期初金额 收入数量 收入单价 收入金额 发出数量 发出单价 发出金额 结存数量 结存单价 结存金额
STORE GOODS SQT SPRICE SAM IQT IPRICE IAM OQT OPRICE OAM EQT EPRICE EAM
原料仓 A001 330 20.4 6,732.00 500 21 10,500.00 100 20.761 2,076.14 730 20.761 15,155.86
原料仓 B001 680 2 1,360.00 500 2.2 1,100.00 143 2.085 298.12 1,037 2.085 2,161.88半成仓 B001 0 0 0 23 2.085 47.95 0 0 0 23 2.085 47.952/求把计算出来的当天的发出单价回填到出仓单和进仓单(调拨单) ISIND=0为出仓单有不明白的可以马上提出来,下午一直在线!!