我有以下情况。我正在建立一个库存控制系统,通过它,我控制产品的进出。
在表格中我有产品(代码,描述)。
在另一个表格中,记录产品的移动(代码,product_code,类型[in,out],数量,日期)。
当我尝试计算出来的内容时,出现的内容越少,它就不起作用。
我的查询:
SELECT SUM(s1.quantity) - SUM(s2.quantity)
FROM `stock_movement` AS s1
JOIN `stock_movement` AS s2
ON s1.code_product = s2.code_product
WHERE s1.type = 'IN'
AND s2.type = 'OUT';
结果: 80
此处的正确结果应为(40 + 20) - (10 + 10)= 40,但此查询正在考虑所有输入都是IN和OUT类型,因此结果为80。
任何人都知道我做错了什么?下表数据如下:
表STOCK_MOVEMENT:
| CODE | CODE_PRODUCT | TYPE | QUANTITY | DATA |
| 1 | 30 | IN | 20 | 2018-01-20 |
| 2 | 30 | IN | 40 | 2018-02-03 |
| 3 | 30 | OUT | 10 | 2018-01-20 |
| 4 | 30 | OUT | 10 | 2018-02-03 |
表股票:
|代码|描述|
| 30 | TEST_PRODUCT |
答案 0 :(得分:1)
你不需要在这里自我加入,只需使用条件聚合:
SELECT
CODE_PRODUCT,
SUM(CASE WHEN TYPE = 'IN' THEN QUANTITY ELSE 0 END) -
SUM(CASE WHEN TYPE = 'OUT' THEN QUANTITY ELSE 0 END) AS diff
FROM stock_movement
GROUP BY CODE_PRODUCT;
请注意,我按产品汇总。对于您的特定样本数据集,只有一个产品,因此我们可以删除GROUP BY
并获得相同的结果。但实际上,您可能需要一种处理多种产品的解决方案。