2017-01-09 5 views
-4

に基づいて株式を表示するクエリ私はあなたの助けを必要としてください。..以前のトランザクション

購入した最初の在庫品目は、最初に販売された品目でなければなりません。

私は架空の在庫倉庫の在庫の移動を追跡するために使用するテーブル在庫を持っています。倉庫は最初は空ですが、在庫は在庫の購入( 'IN')の結果として倉庫に移動し、在庫は倉庫から搬出されます( 'OUT')。在庫アイテムの各タイプは、ItemIDによって識別されます。所与のアイテムの購入または販売により、倉庫内または倉庫内の在庫の各移動は、行がStockテーブルに追加され、StockID識別列の値によって一義的に識別され、いくつのアイテムが追加または削除された日付、およびトランザクションの日付。

表在庫:

StockId DocumentID ItemID TranDate TranCode Quantity 
    ------------------------------------------------------------ 
    1  PO001  A021 2016.01.01 IN   3 
    4  SO010  A021 2016.01.02 OUT   2 
    2  PO002  A021 2016.01.10 IN   7 
    3  PO003  A021 2016.02.01 IN   9 
    5  SO011  A021 2016.02.11 OUT   8 
    6  SO012  A023 2016.02.12 OUT   6 

私は下の表のような出力を与えるために、クエリを書くことができますどのように?

SOID POID Quantity 
------------------------ 
SO010 PO001 2 
SO011 PO001 1 
SO011 PO002 7 
SO012 PO003 6 
+1

2番目の表の値を選択するための規則を説明していないため、この質問に答える方法はありません。 – Hogan

+0

あなたは明らかにあなたの数量の稼働合計と、これに基づいて 'OUT' SOIDに対応する 'IN' POIDが何であるかを調べるクエリを探しています...あなたのデータをどのように格納するか再考することをお勧めします。イン・アウト・トランザクションを適切に保管しておけば、追跡したい情報を追跡する方がよいでしょう。 – ZLK

+0

'DocumentID'のどの「SO」値がどの「PO」値に対応するかはどのように決定されるべきですか?各 'SOnnn'は、同じ' ItemID'の最後の 'PO'に関係していますか?また、 'SO012'はあなたの出力例で' PO003'に関連付けられていますが、2つは異なる 'ItemID'のものです - これは正しいですか? A023アイテムはいつ発売されますか?彼らは 'SO012'にしか言及されておらず、' PO'レコードには言及されていません。 – 3N1GM4

答えて

0

他に誰も見ていないので、私は答えに似たものを投稿します(私は信じています)。

本質的に、あなたがしたいことは、在庫にあるものの数と、日付に基づいて出てきたものの数を追跡することです(私は、複数のものが入ったり来たりすることを考慮していませんしかし、同じ日付に、アウト)。

DECLARE @Table TABLE 
(
    DocumentID VARCHAR(10) NOT NULL, 
    TranCode VARCHAR(3) NOT NULL, 
    TranDate DATE NOT NULL, 
    Quantity INT NOT NULL 
); -- I'm ignoring the other columns here because they don't seem important to your overall needs. 

INSERT @Table (DocumentID, TranCode, TranDate, Quantity) 
VALUES 
    ('PO001', 'IN', '2016-01-01', 3), 
    ('SO010', 'OUT', '2016-01-02', 2), 
    ('PO002', 'IN', '2016-01-10', 7), 
    ('PO003', 'IN', '2016-02-01', 9), 
    ('SO011', 'OUT', '2016-02-11', 8), 
    ('SO012', 'OUT', '2016-02-12', 6); 

WITH CTE AS 
(
    SELECT DocumentID, 
      TranCode, 
      TranDate, 
      Quantity, 
      RunningQuantity = -- Determine the current IN/OUT totals. 
       (
        SELECT SUM(Quantity) 
        FROM @Table 
        WHERE TranCode = T.TranCode 
        AND TranDate <= T.TranDate 
       ), 
      PrevQuantity = -- Keep track of the previous IN/OUT totals. 
       (
        SELECT ISNULL(SUM(Quantity), 0) 
        FROM @Table 
        WHERE TranCode = T.TranCode 
        AND TranDate < T.TranDate 
       ) 
    FROM @Table T 
) 
SELECT Outgoing.DocumentID, 
     Incoming.DocumentID, 
     Quantity = 
      CASE WHEN Outgoing.RunningQuantity <= Incoming.RunningQuantity AND Outgoing.PrevQuantity >= Incoming.PrevQuantity 
       THEN Outgoing.RunningQuantity - Outgoing.PrevQuantity 
       WHEN Outgoing.RunningQuantity <= Incoming.RunningQuantity AND Outgoing.PrevQuantity < Incoming.PrevQuantity 
       THEN Outgoing.RunningQuantity - Incoming.PrevQuantity 
       ELSE Incoming.RunningQuantity - Outgoing.PrevQuantity 
      END 
FROM CTE Outgoing 
JOIN CTE Incoming ON 
     Incoming.TranCode = 'IN' 
    AND Incoming.RunningQuantity > Outgoing.PrevQuantity 
    AND Incoming.PrevQuantity < Outgoing.RunningQuantity 
WHERE Outgoing.TranCode = 'OUT' 
ORDER BY Outgoing.TranDate; 

注:より良い方法で情報を追跡することを強くお勧めします。たとえば、どの注文が他の注文(注文トランザクションテーブルなど)から何を取得したかを実際に詳述するテーブルを作成します。これは、データが構造化されている方法では達成できないものではありませんが、より有用なデータを保存するだけです。

+0

ありがとうございました。あなたの助言に感謝します.. – wibowo

関連する問題