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?
Por exemplo, considere o seguinte esquema:
Table: ITEM
Columns:
ITEM_NUMBER (VARCHAR(15))
QUANTITY_ON_HAND (DECIMAL(5,2))
Primary Key: ITEM_NUMBER
Table: ORDER_ITEM_REQUIREMENTS
Columns:
ITEM_NUMBER (VARCHAR(15), Foreign Key to ITEM)
DATE_ORDERED (TIMESTAMP)
QUANTITY (DECIMAL(4,2))
COST_PER (DECIMAL(10,2))
Primary Key: ITEM_NUMBER+DATE
Solicitação: Para cada número de item, ordene os requisitos do item do pedido em ordem crescente por data e obtenha o valor máximo de modo que a soma das quantidades seja <= a quantidade disponível para esse número do item (obtenha todos os requisitos do item do pedido se a soma é menor que a Quantidade disponível). Em seguida, imprima um resultado contendo ItemNumber, NumShipments, QtySum e CostSum (que é a soma do produto de CostPer e Quantity).
Se for importante, estamos usando o IBM DB2 Versão 7 Revisão 3.
Por exemplo, dados os seguintes dados:
{ITEM_NUMBER: "APPLE", QUANTITY_ON_HAND: 5}
{ITEM_NUMBER: "APPLE", DATE_ORDERED: Jan 1, 12:01, QUANTITY: 2, COST_PER: 1.23}
{ITEM_NUMBER: "APPLE", DATE_ORDERED: Jan 1, 12:02, QUANTITY: 2, COST_PER: 2.34}
{ITEM_NUMBER: "APPLE", DATE_ORDERED: Jan 2, 12:03, QUANTITY: 2, COST_PER: 5.55}
Ou em termos de SQL:
CREATE TABLE MYLIB.ITEM (ITEM_NUMBER VARCHAR(15) NOT NULL NOT HIDDEN , QUANTITY_ON_HAND DECIMAL(5, 2) NOT HIDDEN , PRIMARY KEY (ITEM_NUMBER) ) NOT VOLATILE UNIT ANY KEEP IN MEMORY NO ;
CREATE TABLE MYLIB.ORDER_ITEM_REQUIREMENTS (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) , FOREIGN KEY (ITEM_NUMBER) REFERENCES MYLIB.ITEM (ITEM_NUMBER) ON DELETE NO ACTION ON UPDATE NO ACTION ) NOT VOLATILE UNIT ANY KEEP IN MEMORY NO ;
INSERT INTO MYLIB.ITEM (ITEM_NUMBER, QUANTITY_ON_HAND) VALUES ('APPLE', 5);
INSERT INTO MYLIB.ORDER_ITEM_REQUIREMENTS (ITEM_NUMBER, QUANTITY, COST_PER) VALUES ('APPLE', 2, 1.23);
INSERT INTO MYLIB.ORDER_ITEM_REQUIREMENTS (ITEM_NUMBER, QUANTITY, COST_PER) VALUES ('APPLE', 2, 2.34);
INSERT INTO MYLIB.ORDER_ITEM_REQUIREMENTS (ITEM_NUMBER, QUANTITY, COST_PER) VALUES ('APPLE', 2, 5.55);
Gostaria do seguinte resultado:
{ITEM_NUMBER: "APPLE", NUM_SHIPMENTS: 2, QTY_SUM: 4, COST_SUM: 7.14}
Uma maneira de fazer isso seria
Não tenho acesso ao IBM i, então isso foi testado no Db2 para LUW, mas deve funcionar.
violino