assistance at the request of aging. don't know how to do this?

Guys im a bit stuck usually I have a small idea how even start my query but for it that I don't even know where to begin to tackle
I have a table as follows.
       create table TRRACCD (
       TRRACCD_GRNT_CODE varchar2(6),
       TRRACCD_TRANS_dATE date,
       TRRACCD_AMOUNT number(17,2),
       trraccd_detail_code varchar2(6))
with the data as follows
INSERT INTO TRRACCD (TRRACCD_GRNT_CODE, TRRACCD_TRANS_DATE, TRRACCD_AMOUNT, TRRACCD_DETAIL_CODE) VALUES ('400364',to_date('15-FEB-10', 'DD-MM-RR'),19764.77,'GBIL');
INSERT INTO TRRACCD (TRRACCD_GRNT_CODE, TRRACCD_TRANS_DATE, TRRACCD_AMOUNT, TRRACCD_DETAIL_CODE) VALUES ('400364',to_date('12-MAR-10', 'DD-MM-RR'),2054.29,'GBIL');
INSERT INTO TRRACCD (TRRACCD_GRNT_CODE, TRRACCD_TRANS_DATE, TRRACCD_AMOUNT, TRRACCD_DETAIL_CODE) VALUES ('400364',to_date('20-APR-10', 'DD-MM-RR'),4111.46,'GBIL');
INSERT INTO TRRACCD (TRRACCD_GRNT_CODE, TRRACCD_TRANS_DATE, TRRACCD_AMOUNT, TRRACCD_DETAIL_CODE) VALUES ('400364',to_date('14-MAY-10', 'DD-MM-RR'),2570.1,'GBIL');
INSERT INTO TRRACCD (TRRACCD_GRNT_CODE, TRRACCD_TRANS_DATE, TRRACCD_AMOUNT, TRRACCD_DETAIL_CODE) VALUES ('400364',to_date('10-JUN-10', 'DD-MM-RR'),2176.16,'GBIL');
INSERT INTO TRRACCD (TRRACCD_GRNT_CODE, TRRACCD_TRANS_DATE, TRRACCD_AMOUNT, TRRACCD_DETAIL_CODE) VALUES ('400364',to_date('12-JUL-10', 'DD-MM-RR'),4756.29,'GBIL');
INSERT INTO TRRACCD (TRRACCD_GRNT_CODE, TRRACCD_TRANS_DATE, TRRACCD_AMOUNT, TRRACCD_DETAIL_CODE) VALUES ('400364',to_date('13-AUG-10', 'DD-MM-RR'),28500.62,'GCSH');
INSERT INTO TRRACCD (TRRACCD_GRNT_CODE, TRRACCD_TRANS_DATE, TRRACCD_AMOUNT, TRRACCD_DETAIL_CODE) VALUES ('400364',to_date('16-AUG-10', 'DD-MM-RR'),3602.3,'GBIL');
INSERT INTO TRRACCD (TRRACCD_GRNT_CODE, TRRACCD_TRANS_DATE, TRRACCD_AMOUNT, TRRACCD_DETAIL_CODE) VALUES ('400364',to_date('17-SEP-10', 'DD-MM-RR'),3995.79,'GBIL');
INSERT INTO TRRACCD (TRRACCD_GRNT_CODE, TRRACCD_TRANS_DATE, TRRACCD_AMOUNT, TRRACCD_DETAIL_CODE) VALUES ('400364',to_date('11-OCT-10', 'DD-MM-RR'),3413.6,'GBIL');
INSERT INTO TRRACCD (TRRACCD_GRNT_CODE, TRRACCD_TRANS_DATE, TRRACCD_AMOUNT, TRRACCD_DETAIL_CODE) VALUES ('400364',to_date('11-NOV-10', 'DD-MM-RR'),2119.86,'GBIL');
INSERT INTO TRRACCD (TRRACCD_GRNT_CODE, TRRACCD_TRANS_DATE, TRRACCD_AMOUNT, TRRACCD_DETAIL_CODE) VALUES ('400364',to_date('10-DEC-10', 'DD-MM-RR'),5905.52,'GBIL');
INSERT INTO TRRACCD (TRRACCD_GRNT_CODE, TRRACCD_TRANS_DATE, TRRACCD_AMOUNT, TRRACCD_DETAIL_CODE) VALUES ('400364',to_date('10-DEC-10', 'DD-MM-RR'),12008.21,'GBIL');
INSERT INTO TRRACCD (TRRACCD_GRNT_CODE, TRRACCD_TRANS_DATE, TRRACCD_AMOUNT, TRRACCD_DETAIL_CODE) VALUES ('400364',to_date('11-JAN-11', 'DD-MM-RR'),-10574.05,'GBIL');
INSERT INTO TRRACCD (TRRACCD_GRNT_CODE, TRRACCD_TRANS_DATE, TRRACCD_AMOUNT, TRRACCD_DETAIL_CODE) VALUES ('400364',to_date('11-JAN-11', 'DD-MM-RR'),20241.9,'GBIL');
However what I need to do, is ending up with an ageing for elements of sums up so the expected output should be something like
tbrraccd_grnt_Code      30-60                    60-90         over90 
400364                      20,241.90              2119.86       7,370.09  


if your confused about how i arrived at the 7370.90 is because i have to subtract entries with GCSH on them and i also need to take 
entries that are - and applied them to the oldest period if the balance of the period is positive. 
IM inclined to say I can make it work with sql but the only other way I can think of is to use plsql?... any suggestions or solutions would be greatly appreciated.


the closest I got to acomplishing this query without pl is the following. I know is lame, but I need help.

SELECT TRRACCD_GRNT_CODE,
       TRRACCD_TRANS_dATE,
       TRRACCD_AMOUNT,
       trraccd_detail_code,
       round(sysdate - TRRACCD_TRANS_dATE) "total days"
       --sum(case when round(sysdate - TRRACCD_TRANS_dATE)>190 then "greater then 190"end )
       FROM TRRACCD
       where trraccd_grnt_Code = '400364'
       ORDER BY TRRACCD_GRNT_CODE,
                TRRACCD_TRANS_dATE,
                trraccd_detail_code;   

Hello

You may have noticed a resemblance between all these CASE expressions. I think the code easier to debug and maintain if you factored out them like this:

WITH     got_col_num     AS
(
     SELECT     trraccd_grnt_code
     ,     CASE
               WHEN  trraccd_detail_code = 'GCSH'     THEN  -trraccd_amount
                                        ELSE   trraccd_amount
          END          AS net_amount
     ,     trraccd_detail_code
     ,     CASE
              WHEN  trraccd_amount < 0               THEN  4
              WHEN  trraccd_trans_date > SYSDATE - 30     THEN  1
              WHEN  trraccd_trans_date > SYSDATE - 60     THEN  2
              WHEN  trraccd_trans_date > SYSDATE - 90     THEN  3
                                        ELSE  4
          END          AS col_num
     FROM     trraccd
     WHERE     trraccd_trans_date     <= SYSDATE
)
SELECT       trraccd_grnt_code
,       SUM (CASE WHEN col_num = 1 THEN net_amount END)     AS "0-29"
,       SUM (CASE WHEN col_num = 2 THEN net_amount END)     AS "30-59"
,       SUM (CASE WHEN col_num = 3 THEN net_amount END)     AS "60-89"
,       SUM (CASE WHEN col_num = 4 THEN net_amount END)     AS "90 and over"
FROM       got_col_num
GROUP BY  trraccd_grnt_code
ORDER BY  trraccd_grnt_code
;

Output (similar to the last output above):

TRRACC       0-29      30-59      60-89 90 and over
------ ---------- ---------- ---------- -----------
400364    20241.9   17913.73    2119.86     7370.09

Tags: Database

Similar Questions

Maybe you are looking for