按先进先出求库存

paswar 2012-07-13 06:22:01
借用一下网上的例子

if not object_id('进货表') is null
drop table 进货表
Go
Create table 进货表([商品编码] nvarchar(4), [仓库名字] nvarchar(4),[进货价] decimal(18,1),[进货数量] int,[进货日期] Datetime)
Insert 进货表
select N'0001','aaa',10,20,'2008-5-1 10:05:01' union all
select N'0001','aaa',5,50,'2008-5-2 16:01:02' union all
select N'0002','aaa',6,80,'2008-5-1 10:05:01'
Go


if not object_id('销售表') is null
drop table 销售表
Go
Create table 销售表([商品编码] nvarchar(4),[仓库名字] nvarchar(4),[销售数量] int,[销售日期] Datetime)
Insert 销售表
select N'0001','aaa',10,'2008-5-3 11:01:05' union all
select N'0002','aaa',40,'2008-5-3 15:46:13'
Go


;with Purchase
as
(select t1.[仓库名字],t1.[商品编码],t1.[进货价],t1.[进货数量],t1.[进货日期],sum(t2.[进货数量]) as [Sum_进货] from 进货表 t1 join 进货表 t2 on t1.[商品编码]=t2.[商品编码] and t1.[进货日期]>=t2.[进货日期] group by t1.[仓库名字],t1.[商品编码],t1.[进货价],t1.[进货数量],t1.[进货日期])
,Sales
as
(select t1.[仓库名字],t1.[商品编码],t1.[销售数量],t1.[销售日期],sum(t2.[销售数量]) as [Sum_销售] from 销售表 t1 join 销售表 t2 on t1.[商品编码]=t2.[商品编码] and t1.[销售日期]>=t2.[销售日期] group by t1.[仓库名字],t1.[商品编码],t1.[销售数量],t1.[销售日期])

----------------------------------------

如何利用上面的 Purchase, Sales 按先进先出的原则求以下结果:

[仓库名字] [商品编码] [库存数量] [库存成本]
0001 aaa 60 350
0002 aaa 20 240
...全文
132 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
paswar 2012-07-14
  • 打赏
  • 举报
回复
哦,看错了,把插入测试数据的时间都算上了。。

另外库存成本不是按先进先出算吗?上面贴的代码正是我想要的结果,怎么还有按后进先出的?
NET_2011 2012-07-14
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

引用 5 楼 的回复:

SQL code
USE tempdb
go
if not object_id('进货表') is null
drop table 进货表
Go
Create table 进货表([商品编码] nvarchar(4), [仓库名字] nvarchar(4),[进货价] decimal(18,1),[进货数量] int,[进货日期] Datetime)
……
[/Quote]
有用过?

兄弟上次的语句结果都不对,怎么计算的。后进先出你搞成先进先出,这也能得结果?
NET_2011 2012-07-14
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

引用 4 楼 的回复:

计算库存成本是应该用先进先出,而不是先进先出


还有这句我没看懂??什么意思啊?
[/Quote]

进先出
NET_2011 2012-07-14
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

引用 5 楼 的回复:

SQL code
USE tempdb
go
if not object_id('进货表') is null
drop table 进货表
Go
Create table 进货表([商品编码] nvarchar(4), [仓库名字] nvarchar(4),[进货价] decimal(18,1),[进货数量] int,[进货日期] Datetime)
……
[/Quote]

有库存表没有,没有只可这样计算,比用游标还要要快不少。

在对应列上建索引,应该不会太慢。5000条应该<3秒内出结果
paswar 2012-07-14
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

计算库存成本是应该用先进先出,而不是先进先出
[/Quote]

还有这句我没看懂??什么意思啊?
paswar 2012-07-14
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

SQL code
USE tempdb
go
if not object_id('进货表') is null
drop table 进货表
Go
Create table 进货表([商品编码] nvarchar(4), [仓库名字] nvarchar(4),[进货价] decimal(18,1),[进货数量] int,[进货日期] Datetime)
Insert 进货表
select N……
[/Quote]

这种方法之前我也试过了,的确可以计算,但性能太差了,有5000条进仓记录就需花上半分钟以上才算出结果,接受不了,有没有别的更高效的算法呢?
NET_2011 2012-07-14
  • 打赏
  • 举报
回复
USE tempdb
go
if not object_id('进货表') is null
drop table 进货表
Go
Create table 进货表([商品编码] nvarchar(4), [仓库名字] nvarchar(4),[进货价] decimal(18,1),[进货数量] int,[进货日期] Datetime)
Insert 进货表
select N'0001','aaa',10,20,'2008-5-1 10:05:01' union all
select N'0001','aaa',5,50,'2008-5-2 16:01:02' union all
select N'0002','aaa',6,80,'2008-5-1 10:05:01'
Go


if not object_id('销售表') is null
drop table 销售表
Go
Create table 销售表([商品编码] nvarchar(4),[仓库名字] nvarchar(4),[销售数量] int,[销售日期] Datetime)
Insert 销售表
select N'0001','aaa',10,'2008-5-3 11:01:05' union all
select N'0002','aaa',40,'2008-5-3 15:46:13'
Go


select ta.[商品编码],ta.[仓库名字],
ta.[商品编码],
[数量]=
sum(case when tb.出货sum <ta.进货sum-ta.[进货数量] then ta.[进货数量] else ta.进货sum-tb.出货sum END)
,
[库存成本]=sum(case when tb.出货sum <ta.进货sum-ta.[进货数量] then ta.[进货数量] else ta.进货sum-tb.出货sum END*ta.[进货价])
from
(select *
,进货sum=(select sum([进货数量]) from 进货表 where [商品编码]=a.[商品编码] AND [仓库名字]=a.[仓库名字] and [进货日期]!> a.[进货日期])
from 进货表 a
)ta
join
(select [仓库名字],[商品编码],SUM([销售数量]) AS [出货sum] from 销售表 GROUP BY [仓库名字],[商品编码] ) tb
on ta.[商品编码]=tb.[商品编码] and ta.[仓库名字]=tb.[仓库名字] AND tb.出货sum <ta.进货sum
group by ta.[商品编码],ta.[仓库名字]

/*
商品编码 仓库名字 商品编码 数量 库存成本
0001 aaa 0001 60 350.0
0002 aaa 0002 40 240.0
*/
NET_2011 2012-07-14
  • 打赏
  • 举报
回复
计算库存成本是应该用先进先出,而不是先进先出
paswar 2012-07-14
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

with中的join 我也没看出什么作用,所以去掉了。

关于库存成本按照你给的不好计算,因为不知道卖出的是原来进价10元还是5元的货,所以最后库存成本没有给出。
SQL code

;with Purchase
as
(select t1.[仓库名字],t1.[商品编码],
sum(t1.[进货数量]) as [Sum_进货]
from 进货表 t1
group by t1.[仓库名……
[/Quote]

按先进先出的原则,当然是先出完10元的,后再出5元的,
结果集中的第一行成本350 = 10*10+5*50
shoppo0505 2012-07-13
  • 打赏
  • 举报
回复
with中的join 我也没看出什么作用,所以去掉了。

关于库存成本按照你给的不好计算,因为不知道卖出的是原来进价10元还是5元的货,所以最后库存成本没有给出。

;with Purchase
as
(select t1.[仓库名字],t1.[商品编码],
sum(t1.[进货数量]) as [Sum_进货]
from 进货表 t1
group by t1.[仓库名字],t1.[商品编码]
)
,Sales
as
(select t1.[仓库名字],t1.[商品编码],
sum(t1.[销售数量]) as [Sum_销售]
from 销售表 t1
group by t1.[仓库名字],t1.[商品编码]
)
select Purchase.[仓库名字],
Purchase.[商品编码],
[Sum_进货]-[Sum_销售] as [库存数量]
from Purchase
inner join Sales on Purchase.[仓库名字] = Sales.[仓库名字]
and Purchase.[商品编码] = Sales.[商品编码]

34,587

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧