我必须计算我的产品库存成本,所以每次购买后,我必须重新计算**Weighted Average Cost**。
我得到了一个视图,在每次进出之后,它会给我带来当前产品的库存:
document_type document_date product_id qty_out qty_in price row_num stock_balance
SI 01/01/2014 52 0 600 1037.28 1 600
SI 01/01/2014 53 0 300 1357.38 2 300
LC 03/02/2014 53 100 0 1354.16 3 200
LC 03/02/2014 53 150 0 1355.25 4 50
LC 03/02/2014 52 100 0 1035.26 5 500
LC 03/02/2014 52 200 0 1035.04 6 300
LF 03/02/2014 53 0 1040 1356.44 7 1090
LF 03/02/2014 52 0 1560 1045 8 1860
LC 04/02/2014 52 120 0 1039.08 9 1740
LC 04/02/2014 53 100 0 1358.95 10 990
LF 04/02/2014 52 0 600 1038.71 11 2340
LF 04/02/2014 53 0 1040 1363.3 12 2030
LC 05/02/2014 52 100 0 1037.78 13 2240
LF 15/03/2014 53 0 20 1365.87 14 2050
LF 15/03/2014 52 0 50 1054.19 15 2290
我想添加一个计算WAC
字段,如下所示:
document_type document_date product_id qty_out qty_in price row_num stock_balance WAC
SI 01/01/2014 52 0 600 1 037,28 1 600 1037,28000000000
SI 01/01/2014 53 0 300 1 357,38 2 300 1357,38000000000
LC 03/02/2014 53 100 0 1 354,16 3 200 1357,38000000000
LC 03/02/2014 53 150 0 1 355,25 4 50 1357,38000000000
LC 03/02/2014 52 100 0 1 035,26 5 500 1037,28000000000
LC 03/02/2014 52 200 0 1 035,04 6 300 1037,28000000000
LF 03/02/2014 53 0 1040 1 356,44 7 1090 1356,48311926606 --((1357,38*50)+(1040*1356,44))/(1090)
LF 03/02/2014 52 0 1560 1 045,00 8 1860 1043,75483870968 --((1037,28*300)+(1560*1045))/(1860)
LC 04/02/2014 52 120 0 1 039,08 9 1740 1043,75483870968
LC 04/02/2014 53 100 0 1 358,95 10 990 1356,48311926606
LF 04/02/2014 52 0 600 1 038,71 11 2340 1042,46129032258 --((1043,75483870968*1740)+(600*1038,71))/(2340)
LF 04/02/2014 53 0 1040 1 363,30 12 2030 1359,97000000000 --((1356,48311926606*990)+(1040*1363,3))/(2030)
LC 05/02/2014 52 100 0 1 037,78 13 2240 1042,46129032258
LF 15/03/2014 53 0 20 1 365,87 14 2050 1360,03301857239 --((1359,97551136621*2030)+(20*1365,87))/2050
LF 15/03/2014 52 0 50 1 054,19 15 2290 1042.71737568672 --((1042.46129032258*2240)+(50*1054.19))/2290
每个产品只有且只有一个单据类型'SI'
(初始库存),与之关联的价格为initial WAC
。
下面是一个SQL Fiddle示例。
如果有人能帮上忙,我想不通。
编辑:我只是更新了计算的数字,增加了精度,显示小数点后9位。
5条答案
按热度按时间juud5qan1#
您需要使用递归CTE:
SQLFiddle
oxcyiej72#
我在这个移动平均线上花了好几个小时!主要是因为不可靠的窗口函数first/last/nth_value,根据PostgreSQL关于窗口函数的文档:
This is likely to give unhelpful results for nth_value and particularly last_value.
答案是不完整的。要做的事情:
SQLFiddle
cgfeq70w3#
下面是我使用function所做的:
它似乎有一个正确的输出。像这样处理是个好主意吗?
lhcgjxsq4#
C语言中已经有一个聚合函数可以用于PostgreSQL,它的计算速度可能比SQL中的任何解决方案都要快:
https://github.com/Kozea/weighted_mean
yqyhoc1h5#
我使用了下面的文章中提供的数据,这些数据是用于FIFO逻辑的。
https://www.red-gate.com/simple-talk/sql/performance/set-based-speed-phreakery-the-fifo-stock-inventory-sql-problem/
在这里,回报被考虑在内,但我以平均价格计算。
下面是表格结构:
请遵循上述帖子中的ddl声明。
我已经使用了Cte,但是对于1000001条记录,它会使maxrecursion计数最大化。因此,我创建了一个由一个项ID执行的过程,该过程可以由另一个过程迭代。
我在股票表中添加了两列WACPrice和WACRunningTotal。
请在下面找到我的代码:
这将产生如下结果
我现在正在努力寻找COGS。