【问题标题】:MySQL get the difference on joined table - stock transactions/inventory systemMySQL 在连接表上获得差异 - 库存交易/库存系统
【发布时间】:2017-02-18 19:30:25
【问题描述】:

我不知道该怎么问,但无论如何我都会尝试。我有一个数据库结构,可以跟踪每种产品、产品批次和仓库位置的库存。这让我可以准确地知道有哪些产品、价格和位置。

基本上我用两张表来追踪

  • stock_transactions [id, product_id, lot_id, warehouse_location_id, type, quantity]

    1. product_id = 仓库中 SKU 商品的唯一标识符
    2. lot_id = 到达仓库的产品批次的唯一标识符。
    3. warehouse_location_id = 仓库位置的唯一标识符
    4. type = 交易类型 [IN = 进入位置,OUT = OUT 位置]
  • stock_transactions_serials [stock_transaction_id, serial_id]`:

我正在stock_transactions 中为我们从仓库位置移动到另一个位置的每件物品创建一个条目。例如。如果我将 5 件产品 A 从位置 X 移动到位置 y,我将创建两个条目:

INSERT INTO stock_transactions 
(id, product_id, lot_id, warehouse_location_id, type, quantity) 
VALUES (1, 'A', 'Aq2er4', 'X', 'Out', -5)

INSERT INTO stock_transactions 
(id, product_id, lot_id, warehouse_location_id, type, quantity) 
VALUES (1, 'A', 'Aq2er4', 'Y', 'In', 5)

我们通过序列号跟踪某些产品。例如,如果上述产品有序列号,我们将使用条形码阅读器扫描我们已将产品 A 的哪些序列号移动到另一个位置。 stock_transactions_serials 表将跟踪每笔股票交易的序列号。

现在我有两个问题需要解决:

1。我需要获取库存产品和数量列表(按 product_id、lot_id 和 location_id 分组。我通过以下方式实现了这一点:

SELECT id, product_id, lot_id, warehouse_location_id, sum(ST.quantity) as qty
FROM stock_transactions ST 
GROUP BY product_id, lot_id, warehouse_location_id
HAVING qty > 0

我在这里创建了带有一些数据的 SQLFiddle:http://sqlfiddle.com/#!9/fb352/2

2。我需要为该库存获取正确的序列号。我不知道如何解决这个问题......

如果我加入表格,我不会得到正确的结果,或者我的股票 SUM 是错误的。有任何想法吗?我需要以某种方式了解 In 和 Out 交易之间的差异并获得正确的连续剧。

【问题讨论】:

  • 一般的 GROUP BY 规则说:如果指定了 GROUP BY 子句,则 SELECT 列表中的每个列引用必须要么标识一个分组列,要么是一个集合函数的参数!
  • 我猜,你必须使用子查询。
  • @AT-2016 是的,我想,想弄清楚如何

标签: mysql sql inventory


【解决方案1】:

我想你只需要一个JOIN:

SELECT st.product_id, st.lot_id, st.warehouse_location_id, 
       st.quantity as qty
       GROUP_CONCAT(sts.serial_id) as serials
FROM stock_transactions st JOIN
     stock_transactions_serial sts
     ON sts.stock_transaction_id = st.id
GROUP BY st.product_id, st.lot_id, st.warehouse_location_id, st.quantity
HAVING qty > 0;

注意:这将生成一个以逗号分隔的序列号列表。

【讨论】:

  • 我尝试过以同样的方式使用GROUP_CONCAT,但这不起作用。由于它是一对多关系,因此 SUM(quantity) 将是错误的 - 乘以连接的 stock_transactions_serials 表中的子行数!
  • @PrimozRome 。 . .如果我理解正确,那么就可以直接添加到GROUP BY
【解决方案2】:

似乎product_id + lot_id + warehouse_location_idstock_transactions 的自然键。您选择添加代理 id,因此一条记录可以通过其自然键或 ID 来唯一标识。您选择按自然键分组,但也可以按id 分组。这个假设正确吗?

在这种情况下,您可以简单地聚合每个 stock_transactions.id 的序列号(即连接它们)并加入此列表:

SELECT
  ST.id, 
  ST.product_id, 
  ST.lot_id, 
  ST.warehouse_location_id, 
  sum(ST.quantity) as qty,
  STS.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 
GROUP BY ST.product_id, ST.lot_id, ST.warehouse_location_id
HAVING qty > 0;

【讨论】:

  • 嗯不熟悉自然键这个词,但如果我按 ID 分组,那么 SUM 就不对了?!
  • 我明白你在做什么......非常有前途!我需要在一些更复杂的数据集上进行测试和验证。
  • 关于自然键:数据库可能包含一个项目表。它的关键自然是项目编号(可能是全球贸易项目编号 GTIN),但您可以添加一个 ID。然后你会突然有两个属性来唯一标识一条记录; GTIN 和 ID。所以问题是:product_id + lot_id + warehouse_location_id 是否唯一标识了stock_transactions 中的一条记录?
  • 很好的解释谢谢。是的,他们确实... 库存交易意味着您已将一种特定产品 (SKU) 从特定批次移至或移出特定位置。
  • 好,那么我的假设是正确的,查询应该对你有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-17
  • 2011-04-12
  • 1970-01-01
  • 2020-11-14
  • 2018-03-12
相关资源
最近更新 更多