1

テーブル product, pick_qty, shortfall, location, loc_qty があります

Product Picked Qty Shortfall  Location    Location Qty
1742        4       58           1              15
1742        4       58           2              20
1742        4       58           3              15
1742        4       58           4              20
1742        4       58           5              20
1742        4       58           6              20
1742        4       58           7              15
1742        4       58           8              15
1742        4       58           9              15
1742        4       58           10             20

レポートをループして、補充の不足を満たすためにドロップする必要がある場所の数と数量を表示する必要があります。したがって、レポートは次のようになります。

Product Picked Qty  Shortfall  Location  Location Qty
1742        4          58           1       15
1742        4          58           2       20
1742        4          58           3       15
1742        4          58           4       20
4

1 に答える 1

0

SQL を「テーブルをループする」と考えず、テーブル内の行のサブセットを操作するものと考えるのが最善であることに注意してください。

あなたがする必要があるように思われるのは、ある場所からすべてのアイテムを取得し、現在の場所より前のすべての場所を取得した場合にアイテムがいくつになるかを示す現在の合計を作成することです。不足分を満たすのに十分なアイテムが得られるかどうか。

サンプルデータに基づいて、次のクエリは機能しますが、場所が実際には数値でない場合は、行番号列を追加し、場所番号の代わりに行番号を使用するようにクエリを少し調整する必要があります。以下のクエリと非常によく似ています。

SELECT
    Totals.Product, Totals.PickedQty, Totals.ShortFall, Totals.Location, Totals.LocationQty
FROM (
    SELECT
        TheTable.Product, TheTable.PickedQty, TheTable.ShortFall,
        TheTable.Location, TheTable.LocationQty, SUM(ForRunningTotal.LocationQty) AS RunningTotal
    FROM TheTable
        JOIN TheTable ForRunningTotal ON TheTable.Product = ForRunningTotal.Product
            AND TheTable.Location >= ForRunningTotal.Location
    GROUP BY TheTable.Product, TheTable.PickedQty, TheTable.ShortFall, TheTable.Location, TheTable.LocationQty
    ) Totals
-- Note you could also change the join above so the running total is actually the count of only the rows above,
-- not including the current row; Then the WHERE clause below could be "Totals.RunningTotal < Totals.ShortFall".
-- I liked RunningTotal as the sum of this row and all prior, it seems more appropriate to me.
WHERE Totals.RunningTotal - Totals.LocationQty <= Totals.ShortFall
     AND Totals.LocationQty > 0

また、あなたが私の回答を読んでいる限り、関連のない補足事項:上記のデータに基づいて、データベーススキーマは可能な限り正規化されていません。Picked Quantity と ShortFall は実際には Product のみに依存しているように見えるため、それ自体がテーブルになり、Location Quantity は Product と Location に依存するため、それ自体がテーブルになります。1 つの製品に対して異なる Picked Quantities/ShortFall がデータに含まれていると、上記のクエリが壊れてしまうため、指摘しておきます。この状況は、前述の正規化されたテーブルでは不可能です。

于 2012-12-06T12:52:48.997 に答える