請教庫房料品的平均單價算法

ks_reny 2009-02-27 11:00:35
我現在遇到這樣的一個問題,想計算庫房料品的平均單價.
1 庫房收料表 ----記錄平時入庫情況
收料時間 料品代碼 單價 數量
2008-02-05 A 1.2 200
....... 可能有其他料品的收料記錄...
2008-05-17 A 1.15 500
....... 可能有其他料品的收料記錄...
2008-09-26 A 1.0 300
....... 可能有其他料品的收料記錄...
2009-02-20 A 0.8 100
....... 可能有其他料品的收料記錄...
2 庫存表----記錄實時庫存情況 ,收料時庫存增加,領料時庫存減少
料品代碼 庫存
A 600
.............
其他料品的庫存記錄.
我們的算法是這樣的,從目前的庫存來看A料品的目前庫存來源於
一下的收料記錄(我們庫房領料原則是先進后出,就是每次領最先入庫的東西)
2008-05-17 A 1.15 500
2008-09-26 A 1.0 300
2009-02-20 A 0.8 100
那么A料品的平均單價及庫房價值如下:
平均單價=(1.15*500+1.0*300+0.8*100)/(500+300+100)=1.06
庫房價值=(1.15*500+1.0*300+0.8*100)/(500+300+100)*600=636

大家應該知道我的算法了吧,請高手們幫我一下.
我初步估計要用到遊標,但是表的記錄是比較多的,用遊標會很慢的.不知道有沒有更好的方法.

...全文
104 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
fiten_z 2009-03-09
  • 打赏
  • 举报
回复
頂一下,學習中!
dawugui 2009-02-27
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 ks_reny 的回复:]
烏龜大哥:關鍵是如何去判定收料日期,我的平均單價是
平均單價=(1.15*500+1.0*300+0.8*100)/(500+300+100)=1.06
而不是
平均單價=(1.2*200+1.15*500+1.0*300+0.8*100)/(500+300+100+200)=1.12

2008-05-17之前的收料已經滿足目前庫存了,所以不用判斷收料在2008-05-17之前的記錄了.
[/Quote]
如何去判定收料日期我不知道,如果强行加入,可以写死,或通过其他条件得到.

select 料品代碼 ,
平均單價 = sum(單價*數量) / sum(數量),
庫房價值 = sum(單價*數量) / sum(數量) * (select 庫存 from 料品代碼 n where n.料品代碼 = m.料品代碼)
from 庫房收料表 m where 收料時間 > ....
group by 料品代碼
ks_reny 2009-02-27
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 dawugui 的回复:]
--这样?

select 料品代碼 ,
平均單價 = sum(單價*數量) / sum(數量),
庫房價值 = sum(單價*數量) / sum(數量) * (select 庫存 from 料品代碼 n where n.料品代碼 = m.料品代碼)
from 庫房收料表 m
group by 料品代碼
[/Quote]
烏龜大哥:關鍵是如何去判定收料日期,我的平均單價是
平均單價=(1.15*500+1.0*300+0.8*100)/(500+300+100)=1.06
而不是
平均單價=(1.2*200+1.15*500+1.0*300+0.8*100)/(500+300+100+200)=1.12

2008-05-17之前的收料已經滿足目前庫存了,所以不用判斷收料在2008-05-17之前的記錄了.
zzxap 2009-02-27
  • 打赏
  • 举报
回复
select 料品代碼 ,
平均單價 = sum(單價*數量) / sum(數量),
庫房價值 = sum(單價*數量) / sum(數量) * (select 庫存 from 料品代碼 n where n.料品代碼 = m.料品代碼)
from 庫房收料表 m
group by 料品代碼
dawugui 2009-02-27
  • 打赏
  • 举报
回复
--这样?

select 料品代碼 ,
平均單價 = sum(單價*數量) / sum(數量),
庫房價值 = sum(單價*數量) / sum(數量) * (select 庫存 from 料品代碼 n where n.料品代碼 = m.料品代碼)
from 庫房收料表 m
group by 料品代碼
dawugui 2009-02-27
  • 打赏
  • 举报
回复
--这样?

select 平均單價 = sum(單價*數量) / sum(數量),
庫房價值 = sum(單價*數量) / sum(數量) * 600
from tb
you_tube 2009-02-27
  • 打赏
  • 举报
回复
这个友情帮顶了.
dawugui 2009-02-27
  • 打赏
  • 举报
回复
这个友情帮顶了.
快乐_石头 2009-02-27
  • 打赏
  • 举报
回复
幫頂~~~
ks_reny 2009-02-27
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 dawugui 的回复:]
引用 9 楼 ks_reny 的回复:
自己頂一下.

如何去判定收料日期?
[/Quote]
當一個料品的目前庫存是600,那從收料單中按日期的順序排列抓取收料數量(時間距目前最近的排在前面),
當抓取的收料數量小於600,繼續從收料單中抓取,當抓取的數量大於或等於600時,則停止,就把現在抓取的收料單進行平均單價計算.

收料時間 料品代碼 單價 數量
2008-02-05 A 1.2 200
....... 可能有其他料品的收料記錄...
2008-05-17 A 1.15 500
....... 可能有其他料品的收料記錄...
2008-09-26 A 1.0 300
....... 可能有其他料品的收料記錄...
2009-02-20 A 0.8 100
....... 可能有其他料品的收料記錄...
2 庫存表----記錄實時庫存情況 ,收料時庫存增加,領料時庫存減少
料品代碼 庫存
A 600
A 料號 目前的庫存是600, 那從收料記錄中 先抓取
2009-02-20 A 0.8 100
判斷 100<600 繼續抓取
2008-09-26 A 1.0 300
判斷 100+300<600 繼續抓取
2008-05-17 A 1.15 500
判斷 100+300+500>600 則停止.
計算A料號的平均單價
平均單價=(1.15*500+1.0*300+0.8*100)/(500+300+100)=1.06

claro 2009-02-27
  • 打赏
  • 举报
回复
帮顶。
dawugui 2009-02-27
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 ks_reny 的回复:]
自己頂一下.
[/Quote]
如何去判定收料日期?
ks_reny 2009-02-27
  • 打赏
  • 举报
回复
自己頂一下.

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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