【发布时间】:2017-01-13 13:20:23
【问题描述】:
我有带有表stock_transactions 和stock_transactions_serials 的库存数据库设计。库存交易表包含来自仓库的所有 IN 和 OUT 交易。每笔交易都可以有序列号列表,记录在stock_transactions_serials,其中索引为stock_transaction_id+serial_id。
我需要编写一个查询,列出 qty > 0 的所有位置上的连续剧列表。我在这里构建了 SQL fiddle 以便有一些数据可以处理http://sqlfiddle.com/#!9/520bfa/5。
目前我的SQL是这样的:
SELECT
ST.id,
ST.warehouse_location_id,
ST.product_id,
SUM(ST.quantity) AS qty,
STS.serials AS serials
FROM stock_transactions ST
LEFT JOIN (
SELECT stock_transaction_id, GROUP_CONCAT(serial_id) AS serials
FROM stock_transactions_serials
GROUP by stock_transaction_id
) STS ON STS.stock_transaction_id = ST.id
WHERE
ST.document_id = 9
GROUP BY ST.warehouse_location_id
HAVING qty > 0
此 SQL 的结果不太正确。数量是正确的,但序列号是错误的……它没有考虑与本文档的其他股票交易一起离开或进入位置的序列号。
结果应该是:
位置 51 连续剧:22229
位置 52 连续剧:22221、22222、22223、22224、22225
更新:只是为了让我的问题更清楚。您将序列号为 A、B、C、D、E 的 5 台计算机从位置 X 移动到位置 Y。现在您有 5 台笔记本电脑的序列号位于位置 Y。接下来,您将一台笔记本电脑从位置 Y 的序列号 A 移回位置 X。然后是另一台带有序列号 F 的笔记本电脑,从位置 X 到位置 Z...我想知道在所有交易之后每个位置的笔记本电脑数量(以及哪些序列号)......
UPDATE2:也想为没有序列号的项目提供解决方案。例如,我将 5 个 U 盘从位置 A 移动到位置 B。然后将 2 个从 B 移动到 C。最后再将另外 2 个从 A 移动到 C。每个位置的数量是多少。
【问题讨论】:
-
一般的 GROUP BY 规则说:如果指定了 GROUP BY 子句,则 SELECT 列表中的每个列引用必须要么标识一个分组列,要么是一个集合函数的参数!
-
@jarlh 不幸的是,您的评论对我没有多大帮助
-
我看不懂
It's not incalculating开头的那句话。请澄清问题。 -
@Shadow 我已经改变了我的问题。我的意思是说我的查询没有在该位置返回正确的连续剧。它不会带走从一个位置离开的连续剧和通过另一笔交易进入该位置的新连续剧......
-
我还是不明白你的意思。
标签: mysql sql inventory-management