注文数量が消費されるまで注文数量を再帰的に更新できるかどうかを判断しようとしているCTEを調査しています。ここ CTE - 消費される総量が再帰的に更新される
はテーブルとのレコードである:CREATE TABLE [dbo].[myOrder](
[Account] [float] NOT NULL,
[Item] [float] NOT NULL,
[Quantity] [float] NOT NULL
) ON [PRIMARY]
insert into dbo.myOrder values (12345, 1, 50)
CREATE TABLE [dbo].[myInventory](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Account] [float] NOT NULL,
[InvDate] [numeric](18, 0) NOT NULL,
[Item] [float] NOT NULL,
[Quantity] [float] NOT NULL,
[QuantitySold] [float] NOT NULL
) ON [PRIMARY]
insert into dbo.myInventory values (12345, 111287, 1, 45, 40)
insert into dbo.myInventory values (12345, 111290, 1, 40, 0)
insert into dbo.myInventory values (12345, 111290, 1, 12, 0)
insert into dbo.myInventory values (12345, 111291, 1, 25, 0)
myOrderテーブルのレコードは、注文アイテム#1、数量50のアカウント12345のために作成されることを示す:
Account Item Quantity
------- ---- --------
12345 1 50
在庫表には、12345アカウントのアイテム1がたくさんあることがわかります。
ID Account InvDate Item Quantity QuantitySold
-- ------- ------- ---- -------- ------------
1 12345 111287 1 45 40
2 12345 111290 1 40 0
3 12345 111290 1 12 0
4 12345 111291 1 25 0
ゴアlは、すべての50が消費されるまで、インベントリレコードに注文数量50を差し込むことです。インベントリレコードは、[InvDate]列の値によって順序付けられます。レコード1には5個の残量(45 - 40 = 5)があり、これにより、注文のために消費する量が45個増えます。あなたがしなければならない、在庫テーブルにQuantitySold、QuantityRemainingない、よう:
ID Account InvDate Item Quantity QuantitySold
-- ------- ------- ---- -------- ------------
1 12345 111287 1 45 45
2 12345 111290 1 40 40
3 12345 111290 1 12 5
4 12345 111291 1 25 0
注:クエリは次のようになり、在庫レコードを完了すると40レコード3を消費することができますレコード2は、最後の5を消費することができます数量(Quantity - QuantitySold)を使用して、在庫レコードごとに残っている量を決定します。
CTEはほとんどどこにもありません。私はあなたのCTEに2つの部分(初期化部分と一緒に組み合わされた再帰部分)を持っている場所を選択するための例をたくさん見つけました。私はこれをカーソルで書くことができましたが、CTEで行うことは可能だと思います。
これは誰でもCTEで可能であることを確認したり、CTEの設定方法を説明してくれれば幸いです。ありがとう!
+1 DDLスクリプトの場合 –
トピックはありませんが、なぜ* float *を使用して数量を計っていますか?あなたは本当に* 2の1.47E-19を在庫に残しておきたいですか? –
ダミアン - 公正な質問。私の会社は数量欄に浮動小数点を使用するERPとしてJDEdwardsを使用しています。私はそれを念頭に置いてこれらのテーブルを作りました。ああ、レガシーデータベース! – Brian