他に誰も見ていないので、私は答えに似たものを投稿します(私は信じています)。
本質的に、あなたがしたいことは、在庫にあるものの数と、日付に基づいて出てきたものの数を追跡することです(私は、複数のものが入ったり来たりすることを考慮していませんしかし、同じ日付に、アウト)。
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;
注:より良い方法で情報を追跡することを強くお勧めします。たとえば、どの注文が他の注文(注文トランザクションテーブルなど)から何を取得したかを実際に詳述するテーブルを作成します。これは、データが構造化されている方法では達成できないものではありませんが、より有用なデータを保存するだけです。
2番目の表の値を選択するための規則を説明していないため、この質問に答える方法はありません。 – Hogan
あなたは明らかにあなたの数量の稼働合計と、これに基づいて 'OUT' SOIDに対応する 'IN' POIDが何であるかを調べるクエリを探しています...あなたのデータをどのように格納するか再考することをお勧めします。イン・アウト・トランザクションを適切に保管しておけば、追跡したい情報を追跡する方がよいでしょう。 – ZLK
'DocumentID'のどの「SO」値がどの「PO」値に対応するかはどのように決定されるべきですか?各 'SOnnn'は、同じ' ItemID'の最後の 'PO'に関係していますか?また、 'SO012'はあなたの出力例で' PO003'に関連付けられていますが、2つは異なる 'ItemID'のものです - これは正しいですか? A023アイテムはいつ発売されますか?彼らは 'SO012'にしか言及されておらず、' PO'レコードには言及されていません。 – 3N1GM4