【问题标题】:mysql inventory transactions - get list of serials on locationsmysql 库存交易 - 获取位置上的连续剧列表
【发布时间】:2017-01-13 13:20:23
【问题描述】:

我有带有表stock_transactionsstock_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


【解决方案1】:

每个资产的当前位置可以从影响序列的最后in 类型的交易中得出。您可以使用以下查询获取这些信息:

select sts.serial_id, max(st.id) as max_in_id
from stock_transactions st
inner join stock_transactions_serials sts on sts.stock_transaction_id = st.id
where st.type='In'
group by sts.serial_id

使用上述查询作为子查询,您可以获得哪些资产被移动到了哪个仓库,同时为您提供计数(在没有期初库存的情况下)。

select st.warehouse_location_id,
       st.product_id,
       count(sts.serial_id) as qty,
       group_concat(sts.serial_id) as serials
from stock_transactions st
inner join stock_transactions_serials sts on sts.stock_transaction_id = st.id
inner join (
    select sts2.serial_id, max(st2.id) as max_in_id
    from stock_transactions st2
    inner join stock_transactions_serials sts2 on sts2.stock_transaction_id = st2.id
    where st2.type='In'
    group by sts2.serial_id) as max_ins on st.id=max_ins.max_in_id and sts.serial_id=max_ins.serial_id
group by st.warehouse_location_id, st.product_id

上述查询假设您不能为不同的产品拥有相同的序列号,stock_transaction_id,serial_id 字段上的 PK 暗示了这一点。

【讨论】:

  • 还没有时间测试,但是这个查询是否也适用于没有连续剧的材料?例如从位置 X 到 Y 的 5 个和平,从 Y 到 Z 的 3 个等...
  • 不,不会,因为这不是问题所在。
  • 忘了说
  • 如果你能帮助我,我已经更新了我的问题。您的查询非常适合带有连续出版物的项目。我进行了广泛的测试。但我想有一个解决方案也适用于没有序列的项目。这意味着我需要找出每个地点的每种产品的数量
  • 对不起,但这完全改变了问题,因为您不能将相同的逻辑应用于没有序列号的项目,因此我认为将其包含在您当前的问题中是不公平的。你必须做一个运行总计(a.k.a 累积总和),或者更好的是,将库存水平保持在一个单独的表中。 SO上有很多关于这个的问题和答案。如果您仍然无法弄清楚,请先进行自己的研究并发布另一个问题。
猜你喜欢
  • 2017-02-18
  • 1970-01-01
  • 2020-02-27
  • 1970-01-01
  • 2018-06-25
  • 2015-02-17
  • 2021-02-13
  • 1970-01-01
  • 2021-03-05
相关资源
最近更新 更多