Ho svolto ricerche sui CTE cercando di determinare se è possibile aggiornare in modo ricorsivo i record di quantità di magazzino con una quantità dell'ordine fino al consumo della quantità dell'ordine.CTE - aggiornamento ricorsivo della quantità fino al totale consumato
Qui ci sono le tabelle e record:
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)
Il record nella tabella Myorder indica che un ordine è necessario creare per conto 12345 per la voce # 1, la quantità 50:
Account Item Quantity
------- ---- --------
12345 1 50
la tabella di inventario dimostra che abbiamo un sacco di voce # 1 a portata di mano per conto 12345:
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
Goa Devo iniziare a collegare la quantità dell'ordine di 50 nei registri di inventario fino a quando tutti e 50 sono stati consumati. I record di inventario sono ordinati in base al valore nella colonna InvDate. Il record 1 ha 5 quantità rimanenti (45 - 40 = 5), il che ci lascerebbe con altri 45 da consumare per l'ordine. Record 2 può consumare 40. Record 3 può consumare l'ultimo 5. al termine della query i record di inventario sarebbe simile a questa:
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
Nota: La tabella contiene l'inventario QuantitySold, non QuantityRemaining, in modo da avere per fare il matematica (Quantità - Quantità venduta) per determinare la quantità rimanente per record di inventario.
Ho ottenuto quasi nulla con il CTE. Ho trovato un sacco di esempi per fare selezioni in cui si hanno 2 parti per il CTE - una parte di inizializzazione e la parte ricorsiva UNIONed insieme. Potrei scrivere questo con un cursore, ma penso che sia possibile fare con un CTE e mi piacerebbe sapere come.
Se qualcuno può confermare ciò è possibile con un CTE o spiegare come impostare il CTE, lo apprezzerei. Grazie!
+1 Per lo script DDL –
Off topic, ma perché stai usando * float * per modellare la quantità? Vuoi davvero * essere in grado di avere in magazzino il 1.47E-19 dell'articolo 2? –
Damien: giusta domanda. La mia azienda utilizza JDEdwards come suo ERP, che utilizza float per i suoi campi di quantità. Ho costruito questi tavoli con questo in mente. Ah, database legacy! – Brian