Tentando calcular valores para um relatório FIFO. Existe uma maneira de usar o SQL para agrupar dados de forma que você compare a soma de um valor específico com valores diferentes para cada grupo, incluindo apenas parte de uma linha, se necessário?
Solicitação: Para cada número de item, ordene os itens comprados em ordem decrescente por data e obtenha o valor máximo de modo que a soma das quantidades seja = a quantidade vendida para esse número de item, tomando apenas uma parte da linha final, se necessário obter as quantidades correspondentes. Em seguida, gere um resultado contendo ItemNumber, NumShipments e CostSum (que é a soma do produto de CostPer e Quantity) para o estoque restante que não foi vendido.
Por exemplo, considere o seguinte esquema:
CREATE TABLE MYLIB.TOTAL_ITEM_SOLD (ITEM_NUMBER VARCHAR(15) NOT NULL NOT HIDDEN , QUANTITY_SOLD DECIMAL(5, 2) NOT HIDDEN , PRIMARY KEY (ITEM_NUMBER) ) NOT VOLATILE UNIT ANY KEEP IN MEMORY NO ;
CREATE TABLE MYLIB.ITEM_PURCHASE (ITEM_NUMBER VARCHAR(15) NOT NULL NOT HIDDEN , DATE_ORDERED TIMESTAMP(6) DEFAULT CURRENT_TIMESTAMP NOT NULL NOT HIDDEN , QUANTITY DECIMAL(4, 2) NOT NULL NOT HIDDEN , COST_PER DECIMAL(10, 2) NOT NULL NOT HIDDEN , PRIMARY KEY (DATE_ORDERED, ITEM_NUMBER) ) NOT VOLATILE UNIT ANY KEEP IN MEMORY NO ;
INSERT INTO MYLIB.TOTAL_ITEM_SOLD (ITEM_NUMBER, QUANTITY_SOLD) VALUES ('APPLE', 5);
INSERT INTO MYLIB.ITEM_PURCHASE (ITEM_NUMBER, QUANTITY, COST_PER) VALUES ('APPLE', 2, 1.23);
INSERT INTO MYLIB.ITEM_PURCHASE (ITEM_NUMBER, QUANTITY, COST_PER) VALUES ('APPLE', 4, 2.34);
INSERT INTO MYLIB.ITEM_PURCHASE (ITEM_NUMBER, QUANTITY, COST_PER) VALUES ('APPLE', 2, 5.55);
Resultado esperado:
{ITEM_NUMBER: "APPLE", QTY_REMAINING: 3, COST_SUM: 13.44}
Porque 5,55+5,55+2,34 = 13,44.
Não tenho certeza se entendi muito bem a descrição verbal do problema, mas pelo que posso discernir mais o que seu resultado esperado parece sugerir, acho que você quer o seguinte. Você deseja tirar
QUANTITY_SOLD
eMYLIB.ITEM
compará-lo com o total atual deQUANTITY
(porITEM_NUMBER
) emMYLIB.ITEM_PURCHASE
conforme obtido na ordem crescente deDATE_ORDERED
. Em seguida, você deseja agregar as linhas em que o total acumulado excede a quantidade vendida, ajustandoQUANTITY
a primeira dessas linhas para refletir a quantidade total subtraída.Ou, em termos SQL, algo assim:
Saída:
Violino .
Nota: esta solução assume que
MYLIB.TOTAL_ITEM_SOLD
contém uma linha porITEM_NUMBER
. Se esse não for o caso, você pode agregarQUANTITY_SOLD
porITEM_NUMBER
e usar o conjunto agregado na junção em vez da tabela original.