我不知道怎么问这个,但无论如何我都会尝试。我有一个数据库结构,可以跟踪每个产品,产品批次和仓库位置的库存。这使我能够准确了解库存中的产品,价格和位置。
基本上我使用两个表来跟踪
stock_transactions
[id,product_id,lot_id,warehouse_location_id,type,quantity]
product_id
=仓库中SKU项目的唯一标识符lot_id
=到达仓库的产品批次的唯一标识符。warehouse_location_id
=仓库位置的唯一标识符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
将跟踪每个股票交易的序列号。
现在我有两个问题需要解决:
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。
如果我加入表格,我就无法获得正确的结果,或者我的库存错误。有任何想法吗?我需要以某种方式获得In和Out交易之间的区别并获得正确的连续出版物。
答案 0 :(得分:1)
似乎product_id
+ lot_id
+ warehouse_location_id
是stock_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;
注意:这将生成以逗号分隔的序列号列表。