MySQL在联合表 - 股票交易/库存系统上获得差异

时间:2016-10-10 11:27:47

标签: mysql sql inventory

我不知道怎么问这个,但无论如何我都会尝试。我有一个数据库结构,可以跟踪每个产品,产品批次和仓库位置的库存。这使我能够准确了解库存中的产品,价格和位置。

基本上我使用两个表来跟踪

  • 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。我需要为该股票获得正确的序列号。我不知道如何解决这个问题......

如果我加入表格,我就无法获得正确的结果,或者我的库存错误。有任何想法吗?我需要以某种方式获得In和Out交易之间的区别并获得正确的连续出版物。

2 个答案:

答案 0 :(得分:1)

似乎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;

答案 1 :(得分:0)

我认为你只需要一个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;

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