0

我有带有表格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 个 USB 记忆棒从位置 A 移动到位置 B。然后将 2 个从 B 移动到 C。最后再将 2 个从 A 移动到 C。每个位置的数量是多少。

4

1 回答 1

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

上面的查询假定您不能为不同的产品拥有相同的序列号,这由 PK onstock_transaction_id字段serial_id暗示。

于 2017-01-13T15:34:45.370 回答