Hi Guys,
I am having below tables used in oracle
bal
ID BALANCE BAL_DATE
1 -11.71 01-JAN-05 00.00.00
1 -405.71 02-JAN-05 00.00.00
1 -760.71 03-JAN-05 00.00.00
ref_table
PRODUCT EFF_FROM_DATE EFF_TO_DATE TYPE MIN_AMT MAX_AMT CHARGE
12 01-JAN-05 00.00.00 01-JAN-06 00.00.00 T1 0 15 0
12 01-JAN-05 00.00.00 01-JAN-06 00.00.00 T2 16 1000 0.75
12 01-JAN-05 00.00.00 01-JAN-06 00.00.00 T3 1001 2000 1.5
12 01-JAN-05 00.00.00 01-JAN-06 00.00.00 T4 2001 5000 3
periods:
START_DATE END_DATE ID
02-JAN-05 00.00.00 13-OCT-05 00.00.00 1
Output required
T1_VAL T2_VAL T3_VAL T4_VAL BAL_DATE T1 T2 T3 T4
-11.71 0 0 0 01-JAN-05 00.00.00 0 0 0 0
-405.71 0 0 0 02-JAN-05 00.00.00 0 0 0 0
0 -760.71 0 0 03-JAN-05 00.00.00 0 0.75 0 0
Query i have used to modify:
select SUM (CASE r.type WHEN 'T1' THEN b.balance ELSE 0 END) AS t1_val
, SUM (CASE r.type WHEN 'T2' THEN b.balance ELSE 0 END) AS t2_val
, SUM (CASE r.type WHEN 'T3' THEN b.balance ELSE 0 END) AS t3_val
, SUM (CASE r.type WHEN 'T4' THEN b.balance ELSE 0 END) AS t4_val,
b.bal_date
, MIN (CASE WHEN r.type='T1' THEN r.charge ELSE 0 END) AS t1
, MIN (CASE WHEN r.type='T2' THEN r.charge ELSE 0 END) AS t2
, MIN (CASE WHEN r.type='T3' THEN r.charge ELSE 0 END) AS t3
, MIN (CASE WHEN r.type='T4' THEN r.charge ELSE 0 END) AS t4
from bal b, reference_table r
where b.bal_date between r.eff_from_date and r.eff_to_date
and abs(round(b.balance)) between r.min_amt and r.max_amt
GROUP BY b.id, b.bal_date
order by bal_date;
Derivation condition:
- First to check bal_date falling in start and end dates of reference table taking into first record
- 01-JAN-05 falling between the dates and check balance i.e 11.71 falls between T1 i.e 0 -15 then place it at T1_val and rest T2_val,t3_val,t4_val as zero
01-JAN-05 00.00.00-11.71000
Then place the charge value in T1 - say here it will be 0 hence
1 01-JAN-05 00.00.00 -11.71 0 0 0 0 0 0 0
If there bal_date falling in periods table then adjust T1 range like 0-500 (500 will default value)and T2 range 501-1000, T3 range 1001 - 2000, T4 2001-5000
The ranges needs to be shifted like below from reference table
T1 0 500 0
T2 501 1000 0.75
T3 1001 2000 1.5
T4 2001 5000 3
Scripts:
CREATE TABLE "REFERENCE_TABLE"
(
"PRODUCT" NUMBER(4, 0),
"EFF_FROM_DATE" DATE,
"EFF_TO_DATE" DATE,
"TYPE" CHAR(2 BYTE),
"MIN_AMT" NUMBER(10, 0),
"MAX_AMT" NUMBER(10, 0),
"CHARGE" NUMBER(5, 2)
);
Insert into reference_table (PRODUCT,EFF_FROM_DATE,EFF_TO_DATE,TYPE,MIN_AMT,MAX_AMT,CHARGE) values (12,to_date('01-JAN-05 00.00.00','DD-MON-RR HH24.MI.SS'),to_date('01-JAN-06 00.00.00','DD-MON-RR HH24.MI.SS'),'T1',0,15,0);
Insert into reference_table (PRODUCT,EFF_FROM_DATE,EFF_TO_DATE,TYPE,MIN_AMT,MAX_AMT,CHARGE) values (12,to_date('01-JAN-05 00.00.00','DD-MON-RR HH24.MI.SS'),to_date('01-JAN-06 00.00.00','DD-MON-RR HH24.MI.SS'),'T2',16,1000,0.75);
Insert into reference_table (PRODUCT,EFF_FROM_DATE,EFF_TO_DATE,TYPE,MIN_AMT,MAX_AMT,CHARGE) values (12,to_date('01-JAN-05 00.00.00','DD-MON-RR HH24.MI.SS'),to_date('01-JAN-06 00.00.00','DD-MON-RR HH24.MI.SS'),'T3',1001,2000,1.5);
Insert into reference_table (PRODUCT,EFF_FROM_DATE,EFF_TO_DATE,TYPE,MIN_AMT,MAX_AMT,CHARGE) values (12,to_date('01-JAN-05 00.00.00','DD-MON-RR HH24.MI.SS'),to_date('01-JAN-06 00.00.00','DD-MON-RR HH24.MI.SS'),'T4',2001,5000,3);
CREATE TABLE "BAL"
(
"ID" NUMBER,
"BALANCE" NUMBER,
"BAL_DATE" DATE
);
Insert into bal (ID,BALANCE,BAL_DATE) values (1,-11.71,to_date('01-JAN-05 00.00.00','DD-MON-RR HH24.MI.SS'));
Insert into bal (ID,BALANCE,BAL_DATE) values (1,-405.71,to_date('02-JAN-05 00.00.00','DD-MON-RR HH24.MI.SS'));
Insert into bal (ID,BALANCE,BAL_DATE) values (1,-760.71,to_date('03-JAN-05 00.00.00','DD-MON-RR HH24.MI.SS'));
CREATE TABLE "PERIODS"
(
"START_DATE" DATE,
"END_DATE" DATE,
"ID" NUMBER
);
Insert into periods (START_DATE,END_DATE,ID) values (to_date('02-JAN-05 00.00.00','DD-MON-RR HH24.MI.SS'),to_date('13-OCT-05 00.00.00','DD-MON-RR HH24.MI.SS'),1);