我已阅读了许多有关生成库存成本平均值的SO帖子,但您如何处理数量字段中存在负值的情况?
据我所知,使用以下逻辑,mysql不会考虑结果的顺序。它不知道在最后2000个苹果数量输入之前,总数量是0,这是最终2000苹果11.33'的成本基础。
有没有办法在单个查询中处理此问题,或者是按顺序执行的步骤函数?
SELECT
fruit,
SUM(quantity) as quantity,
SUM(quantity*price)/SUM(quantity)
FROM products
GROUP BY fruit");
以下是产品样本表 -
+--------+----------+---------+
| id | fruit | quantity | price |
+----+--------+----------+---------+
| 1 | grapes | 2000 | 13.0900 |
| 2 | apples | 1000 | 10.8900 |
| 3 | grapes | 100 | 12.6000 |
| 4 | grapes | 100 | 12.6800 |
| 5 | apples | -1000 | 11.2800 |
| 6 | grapes | 2200 | 12.4300 |
| 7 | grapes | -4400 | 12.4300 |
| 8 | apples | 2000 | 11.3300 |
| 9 | apples | -2000 | 11.3200 |
| 10 | apples | 2000 | 11.3300 |
+----+--------+----------+---------+
价格列显示交易价格。如负值所示,在同一列(数量)中有买入和卖出。
每个水果的产量应为一行,数量和平均价格。在这个例子中,返回应该包括“#11; 11.33”中的苹果,但是我要显示 11.15'因为股票价格被取消了。
+--------+----------+---------+
| fruit | quantity | price |
+--------+----------+---------+
| grapes | 0 | 00.0000 |
| apples | 2000 | 11.3300 |
+--------+----------+---------+
答案 0 :(得分:0)
我猜你的价值只是卖/买,你想要的是交易量的总和。现在,如果你想要一些有库存股票的东西,你需要提供一个更好的公式解释。
使用IF
expresion更改为正确的值
SELECT
fruit,
SUM( IF(quantity>0, quantity, -quantity) ) as quantity,
SUM( IF(quantity>0, quantity, -quantity) * price)
/ SUM( IF(quantity>0, quantity, -quantity) )
FROM products
GROUP BY fruit
HAVING SUM(quantity) != 0
ORDER BY fruit ASC");