Oracle FAQ | Your Portal to the Oracle Knowledge Grid |
![]() |
![]() |
Home -> Community -> Usenet -> c.d.o.misc -> Analytical funtion
Hi All,
Please help with this query.
I am trying to calculate the cummulative inventory by subtracting
sales from receipt. If the inventory is nagative, I want to make it
zero and start again from the next reciept value. Otherwise, I add the
previous inventory value to the current receipt and subtract the
current sales.
Your help will be invaluable.
Thanks.
DROP TABLE inventory;
CREATE TABLE INVENTORY
(
BOOK# NUMBER,
BORROWED_DATE DATE,
SALES NUMBER, RECEIPT NUMBER
INSERT INTO INVENTORY ( BOOK#, BORROWED_DATE, SALES, RECEIPT ) VALUES (
27075, TO_Date( '09/27/2005 12:00:00 AM', 'MM/DD/YYYY HH:MI:SS AM'),
0, 0);
INSERT INTO INVENTORY ( BOOK#, BORROWED_DATE, SALES, RECEIPT ) VALUES (
27075, TO_Date( '09/28/2005 12:00:00 AM', 'MM/DD/YYYY HH:MI:SS AM'),
0, 0);
INSERT INTO INVENTORY ( BOOK#, BORROWED_DATE, SALES, RECEIPT ) VALUES (
27075, TO_Date( '09/29/2005 12:00:00 AM', 'MM/DD/YYYY HH:MI:SS AM'),
0, 0);
INSERT INTO INVENTORY ( BOOK#, BORROWED_DATE, SALES, RECEIPT ) VALUES (
27075, TO_Date( '09/30/2005 12:00:00 AM', 'MM/DD/YYYY HH:MI:SS AM'),
0, 0);
INSERT INTO INVENTORY ( BOOK#, BORROWED_DATE, SALES, RECEIPT ) VALUES (
27075, TO_Date( '10/01/2005 12:00:00 AM', 'MM/DD/YYYY HH:MI:SS AM'),
0, 144);
INSERT INTO INVENTORY ( BOOK#, BORROWED_DATE, SALES, RECEIPT ) VALUES (
27075, TO_Date( '10/02/2005 12:00:00 AM', 'MM/DD/YYYY HH:MI:SS AM'),
0, 0);
INSERT INTO INVENTORY ( BOOK#, BORROWED_DATE, SALES, RECEIPT ) VALUES (
27075, TO_Date( '10/03/2005 12:00:00 AM', 'MM/DD/YYYY HH:MI:SS AM'),
0, 0);
INSERT INTO INVENTORY ( BOOK#, BORROWED_DATE, SALES, RECEIPT ) VALUES (
27075, TO_Date( '10/04/2005 12:00:00 AM', 'MM/DD/YYYY HH:MI:SS AM'),
0, 576);
INSERT INTO INVENTORY ( BOOK#, BORROWED_DATE, SALES, RECEIPT ) VALUES (
27075, TO_Date( '10/05/2005 12:00:00 AM', 'MM/DD/YYYY HH:MI:SS AM'),
0, 0);
INSERT INTO INVENTORY ( BOOK#, BORROWED_DATE, SALES, RECEIPT ) VALUES (
27075, TO_Date( '10/06/2005 12:00:00 AM', 'MM/DD/YYYY HH:MI:SS AM'),
0, 576);
INSERT INTO INVENTORY ( BOOK#, BORROWED_DATE, SALES, RECEIPT ) VALUES (
27075, TO_Date( '10/07/2005 12:00:00 AM', 'MM/DD/YYYY HH:MI:SS AM'),
93, 0);
INSERT INTO INVENTORY ( BOOK#, BORROWED_DATE, SALES, RECEIPT ) VALUES (
27075, TO_Date( '10/08/2005 12:00:00 AM', 'MM/DD/YYYY HH:MI:SS AM'),
270, 162);
INSERT INTO INVENTORY ( BOOK#, BORROWED_DATE, SALES, RECEIPT ) VALUES (
27075, TO_Date( '10/09/2005 12:00:00 AM', 'MM/DD/YYYY HH:MI:SS AM'),
279, 0);
INSERT INTO INVENTORY ( BOOK#, BORROWED_DATE, SALES, RECEIPT ) VALUES (
27075, TO_Date( '10/10/2005 12:00:00 AM', 'MM/DD/YYYY HH:MI:SS AM'),
272, 0);
INSERT INTO INVENTORY ( BOOK#, BORROWED_DATE, SALES, RECEIPT ) VALUES (
27075, TO_Date( '10/11/2005 12:00:00 AM', 'MM/DD/YYYY HH:MI:SS AM'),
103, 0);
INSERT INTO INVENTORY ( BOOK#, BORROWED_DATE, SALES, RECEIPT ) VALUES (
27075, TO_Date( '10/12/2005 12:00:00 AM', 'MM/DD/YYYY HH:MI:SS AM'),
56, 0);
INSERT INTO INVENTORY ( BOOK#, BORROWED_DATE, SALES, RECEIPT ) VALUES (
27075, TO_Date( '10/13/2005 12:00:00 AM', 'MM/DD/YYYY HH:MI:SS AM'),
61, 72);
INSERT INTO INVENTORY ( BOOK#, BORROWED_DATE, SALES, RECEIPT ) VALUES (
27075, TO_Date( '10/14/2005 12:00:00 AM', 'MM/DD/YYYY HH:MI:SS AM'),
73, 0);
INSERT INTO INVENTORY ( BOOK#, BORROWED_DATE, SALES, RECEIPT ) VALUES (
27075, TO_Date( '10/15/2005 12:00:00 AM', 'MM/DD/YYYY HH:MI:SS AM'),
199, 0);
INSERT INTO INVENTORY ( BOOK#, BORROWED_DATE, SALES, RECEIPT ) VALUES (
27075, TO_Date( '10/16/2005 12:00:00 AM', 'MM/DD/YYYY HH:MI:SS AM'),
202, 0);
INSERT INTO INVENTORY ( BOOK#, BORROWED_DATE, SALES, RECEIPT ) VALUES (
27075, TO_Date( '10/17/2005 12:00:00 AM', 'MM/DD/YYYY HH:MI:SS AM'),
38, 0);
INSERT INTO INVENTORY ( BOOK#, BORROWED_DATE, SALES, RECEIPT ) VALUES (
27075, TO_Date( '10/18/2005 12:00:00 AM', 'MM/DD/YYYY HH:MI:SS AM'),
41, 612);
INSERT INTO INVENTORY ( BOOK#, BORROWED_DATE, SALES, RECEIPT ) VALUES (
27075, TO_Date( '10/19/2005 12:00:00 AM', 'MM/DD/YYYY HH:MI:SS AM'),
28, 0);
INSERT INTO INVENTORY ( BOOK#, BORROWED_DATE, SALES, RECEIPT ) VALUES (
27075, TO_Date( '10/20/2005 12:00:00 AM', 'MM/DD/YYYY HH:MI:SS AM'),
44, 0);
INSERT INTO INVENTORY ( BOOK#, BORROWED_DATE, SALES, RECEIPT ) VALUES (
27075, TO_Date( '10/21/2005 12:00:00 AM', 'MM/DD/YYYY HH:MI:SS AM'),
80, 0);
INSERT INTO INVENTORY ( BOOK#, BORROWED_DATE, SALES, RECEIPT ) VALUES (
27075, TO_Date( '10/22/2005 12:00:00 AM', 'MM/DD/YYYY HH:MI:SS AM'),
239, 0);
INSERT INTO INVENTORY ( BOOK#, BORROWED_DATE, SALES, RECEIPT ) VALUES (
27075, TO_Date( '10/23/2005 12:00:00 AM', 'MM/DD/YYYY HH:MI:SS AM'),
285, 0);
INSERT INTO INVENTORY ( BOOK#, BORROWED_DATE, SALES, RECEIPT ) VALUES (
27075, TO_Date( '10/24/2005 12:00:00 AM', 'MM/DD/YYYY HH:MI:SS AM'),
39, 0);
INSERT INTO INVENTORY ( BOOK#, BORROWED_DATE, SALES, RECEIPT ) VALUES (
27075, TO_Date( '10/25/2005 12:00:00 AM', 'MM/DD/YYYY HH:MI:SS AM'),
40, 294);
INSERT INTO INVENTORY ( BOOK#, BORROWED_DATE, SALES, RECEIPT ) VALUES (
27075, TO_Date( '10/26/2005 12:00:00 AM', 'MM/DD/YYYY HH:MI:SS AM'),
45, 0);
INSERT INTO INVENTORY ( BOOK#, BORROWED_DATE, SALES, RECEIPT ) VALUES (
27075, TO_Date( '10/27/2005 12:00:00 AM', 'MM/DD/YYYY HH:MI:SS AM'),
38, 42);
INSERT INTO INVENTORY ( BOOK#, BORROWED_DATE, SALES, RECEIPT ) VALUES (
27075, TO_Date( '10/28/2005 12:00:00 AM', 'MM/DD/YYYY HH:MI:SS AM'),
51, 0);
INSERT INTO INVENTORY ( BOOK#, BORROWED_DATE, SALES, RECEIPT ) VALUES (
27075, TO_Date( '10/29/2005 12:00:00 AM', 'MM/DD/YYYY HH:MI:SS AM'),
138, 42);
INSERT INTO INVENTORY ( BOOK#, BORROWED_DATE, SALES, RECEIPT ) VALUES (
27075, TO_Date( '10/30/2005 12:00:00 AM', 'MM/DD/YYYY HH:MI:SS AM'),
177, 0);
INSERT INTO INVENTORY ( BOOK#, BORROWED_DATE, SALES, RECEIPT ) VALUES (
27075, TO_Date( '10/31/2005 12:00:00 AM', 'MM/DD/YYYY HH:MI:SS AM'),
1, 0);
INSERT INTO INVENTORY ( BOOK#, BORROWED_DATE, SALES, RECEIPT ) VALUES (
27075, TO_Date( '11/01/2005 12:00:00 AM', 'MM/DD/YYYY HH:MI:SS AM'),
0, 0);
INSERT INTO INVENTORY ( BOOK#, BORROWED_DATE, SALES, RECEIPT ) VALUES (
27075, TO_Date( '11/02/2005 12:00:00 AM', 'MM/DD/YYYY HH:MI:SS AM'),
1, 0);
COMMIT;
---QUERY
SELECT book#,borrowed_date,sales,receipt,
CASE WHEN SIGN( SUM(receipt-sales) over(partition by book#,grp ORDER by borrowed_date asc )) = -1 THEN 0
ELSE SUM(receipt-sales) over(partition by book#,grp ORDER by borrowed_date asc ) END ending_inventory
FROM ( SELECT book#,borrowed_date,sales,receipt, MAX(rn) over(partition by book# ORDER by borrowed_date asc ) grp FROM( SELECT book#,borrowed_date,sales,receipt, CASE WHEN SIGN(receipt) = 1 AND SIGN(LAG(ending_inventory)over(partition by book# ORDER by borrowed_date asc )) = -1 AND SIGN(LEAD(receipt- sales)over(partition by book# ORDER by borrowed_date asc )) = -1 THEN row_number() over(partition by book# order by borrowed_date asc) ELSE NULL END rn FROM ( SELECT book#,borrowed_date,sales,receipt, sum(receipt) over(partition by book# ORDER by borrowed_date asc ) - sum(sales) over(partition by book# ORDER by borrowed_date asc ) ending_inventory FROM inventory ) ) ) ORDER BY borrowed_date asc -------------my output BOOK# BORROWED_DATE SALES RECEIPT ENDING_INVENTORY 27075 9/27/2005 0 0 0 27075 9/28/2005 0 0 0 27075 9/29/2005 0 0 0 27075 9/30/2005 0 0 0 27075 10/1/2005 0 144 144 27075 10/2/2005 0 0 144 27075 10/3/2005 0 0 144 27075 10/4/2005 0 576 720 27075 10/5/2005 0 0 720 27075 10/6/2005 0 576 1296 27075 10/7/2005 93 0 1203 27075 10/8/2005 270 162 1095 27075 10/9/2005 279 0 816 27075 10/10/2005 272 0 544 27075 10/11/2005 103 0 441 27075 10/12/2005 56 0 385 27075 10/13/2005 61 72 396 27075 10/14/2005 73 0 323 27075 10/15/2005 199 0 124 27075 10/16/2005 202 0 0 27075 10/17/2005 38 0 0 27075 10/18/2005 41 612 571 27075 10/19/2005 28 0 543 27075 10/20/2005 44 0 499 27075 10/21/2005 80 0 419 27075 10/22/2005 239 0 180 27075 10/23/2005 285 0 0 27075 10/24/2005 39 0 0 27075 10/25/2005 40 294 254 27075 10/26/2005 45 0 209 27075 10/27/2005 38 42 4 <<<<====== wrong 27075 10/28/2005 51 0 0 <<<<====== wrong 27075 10/29/2005 138 42 0 <<<<====== wrong 27075 10/30/2005 177 0 0 27075 10/31/2005 1 0 0 27075 11/1/2005 0 0 0 27075 11/2/2005 1 0 0
EXPECTED OUTPUT
BOOK# BORROWED_DATE SALES RECEIPT ENDING_INVENTORY 27075 9/27/2005 0 0 0 27075 9/28/2005 0 0 0 27075 9/29/2005 0 0 0 27075 9/30/2005 0 0 0 27075 10/1/2005 0 144 144 27075 10/2/2005 0 0 144 27075 10/3/2005 0 0 144 27075 10/4/2005 0 576 720 27075 10/5/2005 0 0 720 27075 10/6/2005 0 576 1296 27075 10/7/2005 93 0 1203 27075 10/8/2005 270 162 1095 27075 10/9/2005 279 0 816 27075 10/10/2005 272 0 544 27075 10/11/2005 103 0 441 27075 10/12/2005 56 0 385 27075 10/13/2005 61 72 396 27075 10/14/2005 73 0 323 27075 10/15/2005 199 0 124 27075 10/16/2005 202 0 0 27075 10/17/2005 38 0 0 27075 10/18/2005 41 612 571 27075 10/19/2005 28 0 543 27075 10/20/2005 44 0 499 27075 10/21/2005 80 0 419 27075 10/22/2005 239 0 180 27075 10/23/2005 285 0 0 27075 10/24/2005 39 0 0 27075 10/25/2005 40 294 254 27075 10/26/2005 45 0 209 27075 10/27/2005 38 42 213 27075 10/28/2005 51 0 162 27075 10/29/2005 138 42 66 27075 10/30/2005 177 0 0 27075 10/31/2005 1 0 0 27075 11/1/2005 0 0 0 27075 11/2/2005 1 0 0Received on Fri Jun 16 2006 - 11:30:25 CDT
![]() |
![]() |