0

テーブルstock_transactionsstock_transactions_serials. 在庫トランザクション テーブルは、倉庫からのすべての IN および OUT トランザクションを保持します。各トランザクションは、それに付随するシリアルのリストを持つことができます。これはstock_transactions_serials、index が stock_transaction_id+serial_id である場所に記録されます。

qty > 0 のすべての場所のシリアルのリストを一覧表示するクエリを作成する必要があります。 http://sqlfiddle.com/#!9/520bfa/5で動作するデータを取得するために、ここで SQL fiddle を作成しました。

現在、私の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 の結果は正しくありません。QTY は正しいが、シリアル番号が間違っている... このドキュメントの他の在庫取引と一緒に出た、または入ったシリアル番号は考慮されていません。

結果は次のようになります。

ロケーション 51 シリアル: 22229

ロケーション 52 シリアル: 22221、22222、22223、22224、22225

更新:私の質問をより明確にするためだけに。シリアル番号 A、B、C、D、E の 5 台のコンピュータを場所 X から Y に移動します。これで、場所 Y にシリアル番号のある 5 台のラップトップがあります。次に、シリアル番号 A の 1 台のラップトップを場所 Y から場所 X に移動します。そして、ロケーション X からロケーション Z までシリアル F の別のラップトップ... すべてのトランザクションの後で、すべてのロケーションでのラップトップの数量 (およびシリアル番号) を知りたいのですが....

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

stock_transaction_id上記のクエリは、フィールドの PK によって暗示されるように、異なる製品に対して同じシリアル ID を持つことはできないことを前提としていserial_idます。

于 2017-01-13T15:34:45.370 に答える