Home » SQL & PL/SQL » SQL & PL/SQL » To Split data based on dates
To Split data based on dates [message #643614] Tue, 13 October 2015 14:17 Go to next message
rohit_shinez
Messages: 139
Registered: January 2015
Senior Member
Hi,

I am having below tables

Balance:
    
ID	BAL_DATE	BAL	LIMIT_AMOUT
1234	01-Jan-08	-195.34	-5000
1234	02-Jan-08	-209.84	-5000
1234	03-Jan-08	-209.84	-25
1234	04-Jan-08	-54.96	-25
1234	14-Oct-09	-195.34	-25
1234	15-Oct-09	-209.84	-25
1234	16-Oct-09	-209.84	-25
1234	17-Oct-09	-54.96	-25
1234	15-Jun-14	-195.34	-5000
1234	16-Jun-14	-209.84	-5000
1234	17-Jun-14	-209.84	-25
1234	18-Jun-14	-54.96	-25
1234	19-Jun-14	-2000.34	-25
1234	20-Jun-14	-209.84	-25
1234	21-Jun-14	-209.84	-25
1234	22-Jun-14	-54.96	
-25
 
Bucket:
     
ID	CODE	START_DATE	END_DATE	PRODUCT	BUK_ID
879	1490	16-Nov-07	09-Oct-09	2300	1
879	3333	20-Nov-07	08-Oct-09	2300	4
879	1490	10-Oct-09	19-Nov-10	2	2
879	1490	10-Oct-09	19-Nov-10	2	2
879	1490	16-Jun-14	20-Aug-14	2300	3
Reference_table
 
      
PRODUCT	EFF_FROM_DATE	EFF_TO_DATE	TYPE	MIN_AMT	MAX_AMT	RATE	CHARGE
2	20-Oct-00	29-Mar-01	T1	0	250	0	
2	20-Oct-00	29-Mar-01	T2	251	5000	17.4	
2	20-Oct-00	29-Mar-01	T4			26.4	
2	30-Mar-01	08-Jul-01	T1	0	250	0	
2	30-Mar-01	08-Jul-01	T2	251	5000	17.394	
2	30-Mar-01	08-Jul-01	T4			26.4	
2	09-Jul-01	09-Sep-01	T1	0	250	0	
2	09-Jul-01	09-Sep-01	T2	251	5000	11.431	
2	09-Jul-01	09-Sep-01	T4			26.4	
2	10-Sep-01	04-Jun-02	T1	0	250	0	
2	10-Sep-01	04-Jun-02	T2	251	5000	11.431	
2	10-Sep-01	04-Jun-02	T4			24.582	
2	05-Jun-02	09-Jun-02	T1	0	250	0	
2	05-Jun-02	09-Jun-02	T2	251	5000	9.523	
2	05-Jun-02	09-Jun-02	T4			24.582	
2	10-Jun-02	17-Aug-08	T1	0	250	0	
2	10-Jun-02	17-Aug-08	T2	251	5000	11.431	
2	10-Jun-02	17-Aug-08	T4			24.582	
2	18-Aug-08	07-Jun-09	T1	0	250	0	
2	18-Aug-08	07-Jun-09	T2	251	5000	11.431	
2	18-Aug-08	07-Jun-09	T4			0	
2	08-Jun-09	29-Oct-09	T1	0	250	0	
2	08-Jun-09	29-Oct-09	T2	251	5000	14.013	
2	08-Jun-09	29-Oct-09	T4			0	
2	30-Oct-09	29-Apr-10	T1	0	250	0	
2	30-Oct-09	29-Apr-10	T2	251	5000	15.76	
2	30-Oct-09	29-Apr-10	T4			0	
2	30-Apr-10	31-Aug-10	T1	0	250	0	
2	30-Apr-10	31-Aug-10	T2	251	5000	17.82	
2	30-Apr-10	31-Aug-10	T4			0	
2	01-Sep-10	12-Jan-11	T1	0	999	0	
2	01-Sep-10	12-Jan-11	T2	1000	15000	14.013	
2	01-Sep-10	12-Jan-11	T4			0	
2	13-Jan-11	15-Jun-14	T1	0	999	0	
2	13-Jan-11	15-Jun-14	T2	1000	15000	13.97	
2	13-Jan-11	15-Jun-14	T4			0	
2300	27-Jun-96	09-Apr-00	T1	0	0	0	
2300	27-Jun-96	09-Apr-00	T2	1	5000	17.4	
2300	27-Jun-96	09-Apr-00	T4			26.41	
2300	10-Apr-00	09-Sep-01	T1	0	0	0	
2300	10-Apr-00	09-Sep-01	T2	1	5000	17.394	
2300	10-Apr-00	09-Sep-01	T4			26.4	
2300	10-Sep-01	04-Jun-02	T1	0	0	0	
2300	10-Sep-01	04-Jun-02	T2	1	5000	14.628	
2300	10-Sep-01	04-Jun-02	T4			24.582	
2300	05-Jun-02	09-Jun-02	T1	0	0	0	
2300	05-Jun-02	09-Jun-02	T2	1	5000	9.523	
2300	05-Jun-02	09-Jun-02	T4			24.582	
2300	10-Jun-02	01-Jun-08	T1	0	0	0	
2300	10-Jun-02	01-Jun-08	T2	1	5000	14.628	
2300	10-Jun-02	01-Jun-08	T4			24.582	
2300	02-Jun-08	17-Aug-08	T1	0	0	0	
2300	02-Jun-08	17-Aug-08	T2	1	5000	16.623	
2300	02-Jun-08	17-Aug-08	T4			24.582	
2300	18-Aug-08	07-Jun-09	T1	0	0	0	
2300	18-Aug-08	07-Jun-09	T2	1	5000	16.623	
2300	18-Aug-08	07-Jun-09	T4			0	
2300	08-Jun-09	12-Jan-11	T1	0	0	0	
2300	08-Jun-09	12-Jan-11	T2	1	5000	17.82	
2300	08-Jun-09	12-Jan-11	T4			0	
2300	13-Jan-11	15-Jun-14	T1	0	0	0	
2300	13-Jan-11	15-Jun-14	T2	1	5000	17.777	
2300	13-Jan-11	15-Jun-14	T4			0	
2300	15-Jun-14	15-Aug-14	T1	0	500		0.5
2300	15-Jun-14	15-Aug-14	T2	501	1000		0.75
2300	15-Jun-14	15-Aug-14	T3	1001	2000		1.5
2300	15-Jun-14	15-Aug-14	T4	1001			1.5
 

Output:
ID_1	BAL_DATE	T1	T2	T3	T4	T1PER	T2PER	T4PER	T1_DERIVED	T2_DERIVED	T3_DERIVED	T4_DERIVED	REFAM	BM	BUK_ID	T2MAX
1234	01-Jan-08	195	0	0	0	0	14.628	24.582	0	0.07815	0	0	-5000	2300	1	5000
1234	02-Jan-08	200	10	0	0	0	14.628	24.582	0	0.084161	0	0	-5000	2300	1	5000
1234	03-Jan-08	0	25	0	185	0	14.628	24.582	0	0.010019	0	0.124594	-25	2300	1	5000
1234	04-Jan-08	0	25	0	30	0	14.628	24.582	0	0.010019	0	0.020204	-25	2300	1	5000
1234	14-Oct-09	25	0	0	170	0	14.013	0	0	0	0	0	-25	2	2	5000
1234	15-Oct-09	25	0	0	185	0	14.013	0	0	0	0	0	-25	2	2	5000
1234	16-Oct-09	25	0	0	185	0	14.013	0	0	0	0	0	-25	2	2	5000
1234	17-Oct-09	25	0	0	30	0	14.013	0	0	0	0	0	-25	2	2	5000
1234	16-Jun-14	210	0	0	0	0	0	0	0.5	0	0	0	-5000	2300	3	1000
1234	17-Jun-14	210	0	0	0	0	0	0	0.5	0	0	0	-25	2300	3	1000
1234	18-Jun-14	55	0	0	0	0	0	0	0.5	0	0	0	-25	2300	3	1000
1234	19-Jun-14	500	1000	500	0	0	0	0	0.5	0.75	1.5	0	-25	2300	3	1000
1234	20-Jun-14	210	0	0	0	0	0	0	0.5	0	0	0	-25	2300	3	1000
1234	21-Jun-14	210	0	0	0	0	0	0	0.5	0	0	0	-25	2300	3	1000
1234	22-Jun-14	55	0	0	0	0	0	0	0.5	0	0	0	-25	2300	3	1000



Split the bal from balance table by referring to the ref_table in respective T1,T2,T3,T4 where balance falling in that range
Also consider LIMIT_AMOUT from balance table for splitting the records
If the bal is >=15-JUN-2014 then consider the charge column from ref_table and split the balances accordingly without calculating also not check the limit_amout
If bal_date is falling between start and end dates of bucket where code is 3333 then and should not be included due to overlap dates
T1 MAX_AMT - 200
T2 MIN_AMT -201 MAX_AMT - 5000

Query i have used:
SELECT ID_1,
    BAL_DATE,
    T1,
    T2,
    0 T3,
    GREATEST(BAL -(T1 + T2),0) T4,
    T1PER,
    T2PER,
    T4PER,
    ROUND((T1                      * T1PER) /(365 * 100),6) T1_derived,
    ROUND((T2                      * T2PER) /(365 * 100),6) T2_derived,
    ROUND((GREATEST(BAL -(T1 + T2),0) * T4PER) /(365 * 100),6) T4_derived,
    REFAM,
    BM,
    buk_id,
    T2MAX
  FROM
    (SELECT ID_1,
        BAL_DATE,
        BAL,
        REFAM,
      T1,
      GREATEST(LEAST(T2VAL,BAL - T1,DECODE(SIGN(REFAM),1,0,ABS(REFAM)) - T1),0) T2,
      T1PER,
      T2PER,
      T4PER,
      BM,
      buk_id,
      T2MAX
    FROM
      (SELECT ID_1,
        BAL_DATE,
        BAL,
        REFAM,
        LEAST(T1VAL,BAL,DECODE(SIGN(REFAM),1,0,ABS(REFAM))) T1,
        NVL(T2VAL,0) T2VAL,
        T1PER,
        T2PER,
        T4PER,
        BM,
        buk_id,
        T2VAL T2MAX
      FROM
        (SELECT TB.ID ID_1,
          TB.BAL_DATE BAL_DATE,
          ROUND(ABS(TB.BAL)) BAL,
          DECODE(SIGN(TB.LIMIT_AMOUT), - 1,TB.LIMIT_AMOUT,NVL(TB.LIMIT_AMOUT,0)) REFAM,
          MAX(DECODE(TRIM(REF.TYPE),'T1',REF.MAX_AMT)) T1VAL,
          MAX(DECODE(TRIM(REF.TYPE),'T2',REF.MAX_AMT)) T2VAL,
          MAX(DECODE(TRIM(REF.TYPE),'T1',REF.RATE)) T1PER,
          MAX(DECODE(TRIM(REF.TYPE),'T2',REF.RATE)) T2PER,
          MAX(DECODE(TRIM(REF.TYPE),'T4',REF.RATE)) T4PER,
          BKT.product BM,
          bkt.buk_id buk_id
        FROM BALANCE TB,
          Reference_table REF,
          (SELECT DISTINCT start_date,
            end_date,
            product,buk_id
          FROM bucket BK
          WHERE id            = 879 and code <>3333
          ) BKT
        WHERE TB.BAL_DATE BETWEEN REF.EFF_FROM_DATE AND REF.EFF_TO_DATE
        AND TB.BAL_DATE BETWEEN BKT.start_date AND BKT.end_date
        AND BKT.product       = REF.product
        AND TB.ID = 1234
        GROUP BY TB.ID,
          TB.BAL_DATE,
          TB.BAL,
          TB.LIMIT_AMOUT,
          BKT.product,
          bkt.buk_id
        )
      )
    )
    order by BAL_DATE;


Scripts for table creation
CREATE TABLE "BUCKET"
   ( "ID" VARCHAR2(10 BYTE),
  "CODE" NUMBER(4,0),
  "START_DATE" DATE,
  "END_DATE" DATE,
  "PRODUCT" VARCHAR2(20 BYTE),
  "BUK_ID" NUMBER
   );
 
 
 
 
CREATE TABLE "BALANCE"
   ( "ID" NUMBER(10,0) NOT NULL ENABLE,
  "BAL_DATE" DATE NOT NULL ENABLE,
  "BAL" NUMBER(15,2) NOT NULL ENABLE,
  "LIMIT_AMOUT" NUMBER(15,2)
   );
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),
  "RATE" NUMBER(6,3),
  "CHARGE" NUMBER(5,2)
   );
 
 
Insert into bucket (ID,CODE,START_DATE,END_DATE,PRODUCT,BUK_ID) values ('879',1490,to_date('16-NOV-07','DD-MON-RR'),to_date('09-OCT-09','DD-MON-RR'),'2300',1);
Insert into bucket (ID,CODE,START_DATE,END_DATE,PRODUCT,BUK_ID) values ('879',3333,to_date('20-NOV-07','DD-MON-RR'),to_date('08-OCT-09','DD-MON-RR'),'2300',4);
Insert into bucket (ID,CODE,START_DATE,END_DATE,PRODUCT,BUK_ID) values ('879',1490,to_date('10-OCT-09','DD-MON-RR'),to_date('19-NOV-10','DD-MON-RR'),'2',2);
Insert into bucket (ID,CODE,START_DATE,END_DATE,PRODUCT,BUK_ID) values ('879',1490,to_date('10-OCT-09','DD-MON-RR'),to_date('19-NOV-10','DD-MON-RR'),'2',2);
Insert into bucket (ID,CODE,START_DATE,END_DATE,PRODUCT,BUK_ID) values ('879',1490,to_date('16-JUN-14','DD-MON-RR'),to_date('20-AUG-14','DD-MON-RR'),'2300',3);
 
 
 
 
Insert into reference_table (PRODUCT,EFF_FROM_DATE,EFF_TO_DATE,TYPE,MIN_AMT,MAX_AMT,RATE,CHARGE) values (2300,to_date('27-JUN-96','DD-MON-RR'),to_date('09-APR-00','DD-MON-RR'),'T1',0,0,0,null);
Insert into reference_table (PRODUCT,EFF_FROM_DATE,EFF_TO_DATE,TYPE,MIN_AMT,MAX_AMT,RATE,CHARGE) values (2300,to_date('10-APR-00','DD-MON-RR'),to_date('09-SEP-01','DD-MON-RR'),'T1',0,0,0,null);
Insert into reference_table (PRODUCT,EFF_FROM_DATE,EFF_TO_DATE,TYPE,MIN_AMT,MAX_AMT,RATE,CHARGE) values (2300,to_date('10-SEP-01','DD-MON-RR'),to_date('04-JUN-02','DD-MON-RR'),'T1',0,0,0,null);
Insert into reference_table (PRODUCT,EFF_FROM_DATE,EFF_TO_DATE,TYPE,MIN_AMT,MAX_AMT,RATE,CHARGE) values (2300,to_date('05-JUN-02','DD-MON-RR'),to_date('09-JUN-02','DD-MON-RR'),'T1',0,0,0,null);
Insert into reference_table (PRODUCT,EFF_FROM_DATE,EFF_TO_DATE,TYPE,MIN_AMT,MAX_AMT,RATE,CHARGE) values (2300,to_date('10-JUN-02','DD-MON-RR'),to_date('01-JUN-08','DD-MON-RR'),'T1',0,0,0,null);
Insert into reference_table (PRODUCT,EFF_FROM_DATE,EFF_TO_DATE,TYPE,MIN_AMT,MAX_AMT,RATE,CHARGE) values (2300,to_date('02-JUN-08','DD-MON-RR'),to_date('17-AUG-08','DD-MON-RR'),'T1',0,0,0,null);
Insert into reference_table (PRODUCT,EFF_FROM_DATE,EFF_TO_DATE,TYPE,MIN_AMT,MAX_AMT,RATE,CHARGE) values (2300,to_date('18-AUG-08','DD-MON-RR'),to_date('07-JUN-09','DD-MON-RR'),'T1',0,0,0,null);
Insert into reference_table (PRODUCT,EFF_FROM_DATE,EFF_TO_DATE,TYPE,MIN_AMT,MAX_AMT,RATE,CHARGE) values (2300,to_date('08-JUN-09','DD-MON-RR'),to_date('12-JAN-11','DD-MON-RR'),'T1',0,0,0,null);
Insert into reference_table (PRODUCT,EFF_FROM_DATE,EFF_TO_DATE,TYPE,MIN_AMT,MAX_AMT,RATE,CHARGE) values (2300,to_date('13-JAN-11','DD-MON-RR'),to_date('15-JUN-14','DD-MON-RR'),'T1',0,0,0,null);
Insert into reference_table (PRODUCT,EFF_FROM_DATE,EFF_TO_DATE,TYPE,MIN_AMT,MAX_AMT,RATE,CHARGE) values (2300,to_date('27-JUN-96','DD-MON-RR'),to_date('09-APR-00','DD-MON-RR'),'T2',1,5000,17.4,null);
Insert into reference_table (PRODUCT,EFF_FROM_DATE,EFF_TO_DATE,TYPE,MIN_AMT,MAX_AMT,RATE,CHARGE) values (2300,to_date('10-APR-00','DD-MON-RR'),to_date('09-SEP-01','DD-MON-RR'),'T2',1,5000,17.394,null);
Insert into reference_table (PRODUCT,EFF_FROM_DATE,EFF_TO_DATE,TYPE,MIN_AMT,MAX_AMT,RATE,CHARGE) values (2300,to_date('10-SEP-01','DD-MON-RR'),to_date('04-JUN-02','DD-MON-RR'),'T2',1,5000,14.628,null);
Insert into reference_table (PRODUCT,EFF_FROM_DATE,EFF_TO_DATE,TYPE,MIN_AMT,MAX_AMT,RATE,CHARGE) values (2300,to_date('05-JUN-02','DD-MON-RR'),to_date('09-JUN-02','DD-MON-RR'),'T2',1,5000,9.523,null);
Insert into reference_table (PRODUCT,EFF_FROM_DATE,EFF_TO_DATE,TYPE,MIN_AMT,MAX_AMT,RATE,CHARGE) values (2300,to_date('10-JUN-02','DD-MON-RR'),to_date('01-JUN-08','DD-MON-RR'),'T2',1,5000,14.628,null);
Insert into reference_table (PRODUCT,EFF_FROM_DATE,EFF_TO_DATE,TYPE,MIN_AMT,MAX_AMT,RATE,CHARGE) values (2300,to_date('02-JUN-08','DD-MON-RR'),to_date('17-AUG-08','DD-MON-RR'),'T2',1,5000,16.623,null);
Insert into reference_table (PRODUCT,EFF_FROM_DATE,EFF_TO_DATE,TYPE,MIN_AMT,MAX_AMT,RATE,CHARGE) values (2300,to_date('18-AUG-08','DD-MON-RR'),to_date('07-JUN-09','DD-MON-RR'),'T2',1,5000,16.623,null);
Insert into reference_table (PRODUCT,EFF_FROM_DATE,EFF_TO_DATE,TYPE,MIN_AMT,MAX_AMT,RATE,CHARGE) values (2300,to_date('08-JUN-09','DD-MON-RR'),to_date('12-JAN-11','DD-MON-RR'),'T2',1,5000,17.82,null);
Insert into reference_table (PRODUCT,EFF_FROM_DATE,EFF_TO_DATE,TYPE,MIN_AMT,MAX_AMT,RATE,CHARGE) values (2300,to_date('13-JAN-11','DD-MON-RR'),to_date('15-JUN-14','DD-MON-RR'),'T2',1,5000,17.777,null);
Insert into reference_table (PRODUCT,EFF_FROM_DATE,EFF_TO_DATE,TYPE,MIN_AMT,MAX_AMT,RATE,CHARGE) values (2300,to_date('27-JUN-96','DD-MON-RR'),to_date('09-APR-00','DD-MON-RR'),'T4',null,null,26.41,null);
Insert into reference_table (PRODUCT,EFF_FROM_DATE,EFF_TO_DATE,TYPE,MIN_AMT,MAX_AMT,RATE,CHARGE) values (2300,to_date('10-APR-00','DD-MON-RR'),to_date('09-SEP-01','DD-MON-RR'),'T4',null,null,26.4,null);
Insert into reference_table (PRODUCT,EFF_FROM_DATE,EFF_TO_DATE,TYPE,MIN_AMT,MAX_AMT,RATE,CHARGE) values (2300,to_date('10-SEP-01','DD-MON-RR'),to_date('04-JUN-02','DD-MON-RR'),'T4',null,null,24.582,null);
Insert into reference_table (PRODUCT,EFF_FROM_DATE,EFF_TO_DATE,TYPE,MIN_AMT,MAX_AMT,RATE,CHARGE) values (2300,to_date('05-JUN-02','DD-MON-RR'),to_date('09-JUN-02','DD-MON-RR'),'T4',null,null,24.582,null);
Insert into reference_table (PRODUCT,EFF_FROM_DATE,EFF_TO_DATE,TYPE,MIN_AMT,MAX_AMT,RATE,CHARGE) values (2300,to_date('10-JUN-02','DD-MON-RR'),to_date('01-JUN-08','DD-MON-RR'),'T4',null,null,24.582,null);
Insert into reference_table (PRODUCT,EFF_FROM_DATE,EFF_TO_DATE,TYPE,MIN_AMT,MAX_AMT,RATE,CHARGE) values (2300,to_date('02-JUN-08','DD-MON-RR'),to_date('17-AUG-08','DD-MON-RR'),'T4',null,null,24.582,null);
Insert into reference_table (PRODUCT,EFF_FROM_DATE,EFF_TO_DATE,TYPE,MIN_AMT,MAX_AMT,RATE,CHARGE) values (2300,to_date('18-AUG-08','DD-MON-RR'),to_date('07-JUN-09','DD-MON-RR'),'T4',null,null,0,null);
Insert into reference_table (PRODUCT,EFF_FROM_DATE,EFF_TO_DATE,TYPE,MIN_AMT,MAX_AMT,RATE,CHARGE) values (2300,to_date('08-JUN-09','DD-MON-RR'),to_date('12-JAN-11','DD-MON-RR'),'T4',null,null,0,null);
Insert into reference_table (PRODUCT,EFF_FROM_DATE,EFF_TO_DATE,TYPE,MIN_AMT,MAX_AMT,RATE,CHARGE) values (2300,to_date('13-JAN-11','DD-MON-RR'),to_date('15-JUN-14','DD-MON-RR'),'T4',null,null,0,null);
Insert into reference_table (PRODUCT,EFF_FROM_DATE,EFF_TO_DATE,TYPE,MIN_AMT,MAX_AMT,RATE,CHARGE) values (2,to_date('20-OCT-00','DD-MON-RR'),to_date('29-MAR-01','DD-MON-RR'),'T2',251,5000,17.4,null);
Insert into reference_table (PRODUCT,EFF_FROM_DATE,EFF_TO_DATE,TYPE,MIN_AMT,MAX_AMT,RATE,CHARGE) values (2,to_date('20-OCT-00','DD-MON-RR'),to_date('29-MAR-01','DD-MON-RR'),'T1',0,250,0,null);
Insert into reference_table (PRODUCT,EFF_FROM_DATE,EFF_TO_DATE,TYPE,MIN_AMT,MAX_AMT,RATE,CHARGE) values (2,to_date('20-OCT-00','DD-MON-RR'),to_date('29-MAR-01','DD-MON-RR'),'T4',null,null,26.4,null);
Insert into reference_table (PRODUCT,EFF_FROM_DATE,EFF_TO_DATE,TYPE,MIN_AMT,MAX_AMT,RATE,CHARGE) values (2,to_date('30-MAR-01','DD-MON-RR'),to_date('08-JUL-01','DD-MON-RR'),'T1',0,250,0,null);
Insert into reference_table (PRODUCT,EFF_FROM_DATE,EFF_TO_DATE,TYPE,MIN_AMT,MAX_AMT,RATE,CHARGE) values (2,to_date('30-MAR-01','DD-MON-RR'),to_date('08-JUL-01','DD-MON-RR'),'T2',251,5000,17.394,null);
Insert into reference_table (PRODUCT,EFF_FROM_DATE,EFF_TO_DATE,TYPE,MIN_AMT,MAX_AMT,RATE,CHARGE) values (2,to_date('30-MAR-01','DD-MON-RR'),to_date('08-JUL-01','DD-MON-RR'),'T4',null,null,26.4,null);
Insert into reference_table (PRODUCT,EFF_FROM_DATE,EFF_TO_DATE,TYPE,MIN_AMT,MAX_AMT,RATE,CHARGE) values (2,to_date('09-JUL-01','DD-MON-RR'),to_date('09-SEP-01','DD-MON-RR'),'T1',0,250,0,null);
Insert into reference_table (PRODUCT,EFF_FROM_DATE,EFF_TO_DATE,TYPE,MIN_AMT,MAX_AMT,RATE,CHARGE) values (2,to_date('09-JUL-01','DD-MON-RR'),to_date('09-SEP-01','DD-MON-RR'),'T2',251,5000,11.431,null);
Insert into reference_table (PRODUCT,EFF_FROM_DATE,EFF_TO_DATE,TYPE,MIN_AMT,MAX_AMT,RATE,CHARGE) values (2,to_date('09-JUL-01','DD-MON-RR'),to_date('09-SEP-01','DD-MON-RR'),'T4',null,null,26.4,null);
Insert into reference_table (PRODUCT,EFF_FROM_DATE,EFF_TO_DATE,TYPE,MIN_AMT,MAX_AMT,RATE,CHARGE) values (2,to_date('10-SEP-01','DD-MON-RR'),to_date('04-JUN-02','DD-MON-RR'),'T1',0,250,0,null);
Insert into reference_table (PRODUCT,EFF_FROM_DATE,EFF_TO_DATE,TYPE,MIN_AMT,MAX_AMT,RATE,CHARGE) values (2,to_date('10-SEP-01','DD-MON-RR'),to_date('04-JUN-02','DD-MON-RR'),'T2',251,5000,11.431,null);
Insert into reference_table (PRODUCT,EFF_FROM_DATE,EFF_TO_DATE,TYPE,MIN_AMT,MAX_AMT,RATE,CHARGE) values (2,to_date('10-SEP-01','DD-MON-RR'),to_date('04-JUN-02','DD-MON-RR'),'T4',null,null,24.582,null);
Insert into reference_table (PRODUCT,EFF_FROM_DATE,EFF_TO_DATE,TYPE,MIN_AMT,MAX_AMT,RATE,CHARGE) values (2,to_date('05-JUN-02','DD-MON-RR'),to_date('09-JUN-02','DD-MON-RR'),'T1',0,250,0,null);
Insert into reference_table (PRODUCT,EFF_FROM_DATE,EFF_TO_DATE,TYPE,MIN_AMT,MAX_AMT,RATE,CHARGE) values (2,to_date('05-JUN-02','DD-MON-RR'),to_date('09-JUN-02','DD-MON-RR'),'T2',251,5000,9.523,null);
Insert into reference_table (PRODUCT,EFF_FROM_DATE,EFF_TO_DATE,TYPE,MIN_AMT,MAX_AMT,RATE,CHARGE) values (2,to_date('05-JUN-02','DD-MON-RR'),to_date('09-JUN-02','DD-MON-RR'),'T4',null,null,24.582,null);
Insert into reference_table (PRODUCT,EFF_FROM_DATE,EFF_TO_DATE,TYPE,MIN_AMT,MAX_AMT,RATE,CHARGE) values (2,to_date('10-JUN-02','DD-MON-RR'),to_date('17-AUG-08','DD-MON-RR'),'T2',251,5000,11.431,null);
Insert into reference_table (PRODUCT,EFF_FROM_DATE,EFF_TO_DATE,TYPE,MIN_AMT,MAX_AMT,RATE,CHARGE) values (2,to_date('10-JUN-02','DD-MON-RR'),to_date('17-AUG-08','DD-MON-RR'),'T1',0,250,0,null);
Insert into reference_table (PRODUCT,EFF_FROM_DATE,EFF_TO_DATE,TYPE,MIN_AMT,MAX_AMT,RATE,CHARGE) values (2,to_date('10-JUN-02','DD-MON-RR'),to_date('17-AUG-08','DD-MON-RR'),'T4',null,null,24.582,null);
Insert into reference_table (PRODUCT,EFF_FROM_DATE,EFF_TO_DATE,TYPE,MIN_AMT,MAX_AMT,RATE,CHARGE) values (2,to_date('18-AUG-08','DD-MON-RR'),to_date('07-JUN-09','DD-MON-RR'),'T2',251,5000,11.431,null);
Insert into reference_table (PRODUCT,EFF_FROM_DATE,EFF_TO_DATE,TYPE,MIN_AMT,MAX_AMT,RATE,CHARGE) values (2,to_date('18-AUG-08','DD-MON-RR'),to_date('07-JUN-09','DD-MON-RR'),'T1',0,250,0,null);
Insert into reference_table (PRODUCT,EFF_FROM_DATE,EFF_TO_DATE,TYPE,MIN_AMT,MAX_AMT,RATE,CHARGE) values (2,to_date('18-AUG-08','DD-MON-RR'),to_date('07-JUN-09','DD-MON-RR'),'T4',null,null,0,null);
Insert into reference_table (PRODUCT,EFF_FROM_DATE,EFF_TO_DATE,TYPE,MIN_AMT,MAX_AMT,RATE,CHARGE) values (2,to_date('08-JUN-09','DD-MON-RR'),to_date('29-OCT-09','DD-MON-RR'),'T1',0,250,0,null);
Insert into reference_table (PRODUCT,EFF_FROM_DATE,EFF_TO_DATE,TYPE,MIN_AMT,MAX_AMT,RATE,CHARGE) values (2,to_date('08-JUN-09','DD-MON-RR'),to_date('29-OCT-09','DD-MON-RR'),'T2',251,5000,14.013,null);
Insert into reference_table (PRODUCT,EFF_FROM_DATE,EFF_TO_DATE,TYPE,MIN_AMT,MAX_AMT,RATE,CHARGE) values (2,to_date('08-JUN-09','DD-MON-RR'),to_date('29-OCT-09','DD-MON-RR'),'T4',null,null,0,null);
Insert into reference_table (PRODUCT,EFF_FROM_DATE,EFF_TO_DATE,TYPE,MIN_AMT,MAX_AMT,RATE,CHARGE) values (2,to_date('30-OCT-09','DD-MON-RR'),to_date('29-APR-10','DD-MON-RR'),'T2',251,5000,15.76,null);
Insert into reference_table (PRODUCT,EFF_FROM_DATE,EFF_TO_DATE,TYPE,MIN_AMT,MAX_AMT,RATE,CHARGE) values (2,to_date('30-OCT-09','DD-MON-RR'),to_date('29-APR-10','DD-MON-RR'),'T1',0,250,0,null);
Insert into reference_table (PRODUCT,EFF_FROM_DATE,EFF_TO_DATE,TYPE,MIN_AMT,MAX_AMT,RATE,CHARGE) values (2,to_date('30-OCT-09','DD-MON-RR'),to_date('29-APR-10','DD-MON-RR'),'T4',null,null,0,null);
Insert into reference_table (PRODUCT,EFF_FROM_DATE,EFF_TO_DATE,TYPE,MIN_AMT,MAX_AMT,RATE,CHARGE) values (2,to_date('30-APR-10','DD-MON-RR'),to_date('31-AUG-10','DD-MON-RR'),'T1',0,250,0,null);
Insert into reference_table (PRODUCT,EFF_FROM_DATE,EFF_TO_DATE,TYPE,MIN_AMT,MAX_AMT,RATE,CHARGE) values (2,to_date('30-APR-10','DD-MON-RR'),to_date('31-AUG-10','DD-MON-RR'),'T2',251,5000,17.82,null);
Insert into reference_table (PRODUCT,EFF_FROM_DATE,EFF_TO_DATE,TYPE,MIN_AMT,MAX_AMT,RATE,CHARGE) values (2,to_date('30-APR-10','DD-MON-RR'),to_date('31-AUG-10','DD-MON-RR'),'T4',null,null,0,null);
Insert into reference_table (PRODUCT,EFF_FROM_DATE,EFF_TO_DATE,TYPE,MIN_AMT,MAX_AMT,RATE,CHARGE) values (2,to_date('01-SEP-10','DD-MON-RR'),to_date('12-JAN-11','DD-MON-RR'),'T1',0,999,0,null);
Insert into reference_table (PRODUCT,EFF_FROM_DATE,EFF_TO_DATE,TYPE,MIN_AMT,MAX_AMT,RATE,CHARGE) values (2,to_date('01-SEP-10','DD-MON-RR'),to_date('12-JAN-11','DD-MON-RR'),'T2',1000,15000,14.013,null);
Insert into reference_table (PRODUCT,EFF_FROM_DATE,EFF_TO_DATE,TYPE,MIN_AMT,MAX_AMT,RATE,CHARGE) values (2,to_date('01-SEP-10','DD-MON-RR'),to_date('12-JAN-11','DD-MON-RR'),'T4',null,null,0,null);
Insert into reference_table (PRODUCT,EFF_FROM_DATE,EFF_TO_DATE,TYPE,MIN_AMT,MAX_AMT,RATE,CHARGE) values (2,to_date('13-JAN-11','DD-MON-RR'),to_date('15-JUN-14','DD-MON-RR'),'T1',0,999,0,null);
Insert into reference_table (PRODUCT,EFF_FROM_DATE,EFF_TO_DATE,TYPE,MIN_AMT,MAX_AMT,RATE,CHARGE) values (2,to_date('13-JAN-11','DD-MON-RR'),to_date('15-JUN-14','DD-MON-RR'),'T2',1000,15000,13.97,null);
Insert into reference_table (PRODUCT,EFF_FROM_DATE,EFF_TO_DATE,TYPE,MIN_AMT,MAX_AMT,RATE,CHARGE) values (2,to_date('13-JAN-11','DD-MON-RR'),to_date('15-JUN-14','DD-MON-RR'),'T4',null,null,0,null);
Insert into reference_table (PRODUCT,EFF_FROM_DATE,EFF_TO_DATE,TYPE,MIN_AMT,MAX_AMT,RATE,CHARGE) values (2300,to_date('15-JUN-14','DD-MON-RR'),to_date('15-AUG-14','DD-MON-RR'),'T1',0,500,null,0.5);
Insert into reference_table (PRODUCT,EFF_FROM_DATE,EFF_TO_DATE,TYPE,MIN_AMT,MAX_AMT,RATE,CHARGE) values (2300,to_date('15-JUN-14','DD-MON-RR'),to_date('15-AUG-14','DD-MON-RR'),'T2',501,1000,null,0.75);
Insert into reference_table (PRODUCT,EFF_FROM_DATE,EFF_TO_DATE,TYPE,MIN_AMT,MAX_AMT,RATE,CHARGE) values (2300,to_date('15-JUN-14','DD-MON-RR'),to_date('15-AUG-14','DD-MON-RR'),'T3',1001,2000,null,1.5);
Insert into reference_table (PRODUCT,EFF_FROM_DATE,EFF_TO_DATE,TYPE,MIN_AMT,MAX_AMT,RATE,CHARGE) values (2300,to_date('15-JUN-14','DD-MON-RR'),to_date('15-AUG-14','DD-MON-RR'),'T4',1001,null,null,1.5);
 
 
 
 
Insert into balance (ID,BAL_DATE,BAL,LIMIT_AMOUT) values (1234,to_date('01-JAN-08','DD-MON-RR'),-195.34,-5000);
Insert into balance (ID,BAL_DATE,BAL,LIMIT_AMOUT) values (1234,to_date('02-JAN-08','DD-MON-RR'),-209.84,-5000);
Insert into balance (ID,BAL_DATE,BAL,LIMIT_AMOUT) values (1234,to_date('03-JAN-08','DD-MON-RR'),-209.84,-25);
Insert into balance (ID,BAL_DATE,BAL,LIMIT_AMOUT) values (1234,to_date('04-JAN-08','DD-MON-RR'),-54.96,-25);
Insert into balance (ID,BAL_DATE,BAL,LIMIT_AMOUT) values (1234,to_date('14-OCT-09','DD-MON-RR'),-195.34,-25);
Insert into balance (ID,BAL_DATE,BAL,LIMIT_AMOUT) values (1234,to_date('15-OCT-09','DD-MON-RR'),-209.84,-25);
Insert into balance (ID,BAL_DATE,BAL,LIMIT_AMOUT) values (1234,to_date('16-OCT-09','DD-MON-RR'),-209.84,-25);
Insert into balance (ID,BAL_DATE,BAL,LIMIT_AMOUT) values (1234,to_date('17-OCT-09','DD-MON-RR'),-54.96,-25);
Insert into balance (ID,BAL_DATE,BAL,LIMIT_AMOUT) values (1234,to_date('15-JUN-14','DD-MON-RR'),-195.34,-5000);
Insert into balance (ID,BAL_DATE,BAL,LIMIT_AMOUT) values (1234,to_date('16-JUN-14','DD-MON-RR'),-209.84,-5000);
Insert into balance (ID,BAL_DATE,BAL,LIMIT_AMOUT) values (1234,to_date('17-JUN-14','DD-MON-RR'),-209.84,-25);
Insert into balance (ID,BAL_DATE,BAL,LIMIT_AMOUT) values (1234,to_date('18-JUN-14','DD-MON-RR'),-54.96,-25);
Insert into balance (ID,BAL_DATE,BAL,LIMIT_AMOUT) values (1234,to_date('19-JUN-14','DD-MON-RR'),-2000.34,-25);
Insert into balance (ID,BAL_DATE,BAL,LIMIT_AMOUT) values (1234,to_date('20-JUN-14','DD-MON-RR'),-209.84,-25);
Insert into balance (ID,BAL_DATE,BAL,LIMIT_AMOUT) values (1234,to_date('21-JUN-14','DD-MON-RR'),-209.84,-25);
Insert into balance (ID,BAL_DATE,BAL,LIMIT_AMOUT) values (1234,to_date('22-JUN-14','DD-MON-RR'),-54.96,-25);
Re: To Split data based on dates [message #643632 is a reply to message #643614] Wed, 14 October 2015 05:51 Go to previous messageGo to next message
rohit_shinez
Messages: 139
Registered: January 2015
Senior Member
Hi All,

can you help, i have reduced test cases something like below

Balance			
ID	BAL_DATE	BAL	LIMIT_AMOUT
1234	01-Jan-08	-195.34	-5000
1234	02-Jan-08	-209.84	-5000
1234	03-Jan-08	-209.84	-25
1234	04-Jan-08	-54.96	-25
1234	14-Oct-09	-195.34	-25
1234	16-Oct-09	-209.84	-25
1234	15-Jun-14	-195.34	-5000
1234	16-Jun-14	-209.84	-5000
1234	19-Jun-14	-2000.34	-25

Reference Table							
PRODUCT	EFF_FROM_DATE	EFF_TO_DATE	TYPE	MIN_AMT	MAX_AMT	RATE	CHARGE
2	10-Jun-02	17-Aug-08	T1	0	250	0	
2	10-Jun-02	17-Aug-08	T2	251	5000	11.431	
2	10-Jun-02	17-Aug-08	T4			24.582	
2	08-Jun-09	29-Oct-09	T1	0	250	0	
2	08-Jun-09	29-Oct-09	T2	251	5000	14.013	
2	08-Jun-09	29-Oct-09	T4			0	
2300	10-Jun-02	01-Jun-08	T1	0	0	0	
2300	10-Jun-02	01-Jun-08	T2	1	5000	14.628	
2300	10-Jun-02	01-Jun-08	T4			24.582	
2300	08-Jun-09	12-Jan-11	T1	0	0	0	
2300	08-Jun-09	12-Jan-11	T2	1	5000	17.82	
2300	08-Jun-09	12-Jan-11	T4			0	
2300	16-Jun-14	31-Dec-99	T1	0	15		0
2300	16-Jun-14	31-Dec-99	T2	16	1000		0.75
2300	16-Jun-14	31-Dec-99	T3	1001	2000		1.5
2300	16-Jun-14	31-Dec-99	T4	2001	5000		3

Bucket					
ID	CODE	START_DATE	END_DATE	PRODUCT	BUK_ID
879	1490	16-Nov-07	09-Oct-09	2300	1
879	3333	20-Nov-07	08-Oct-09	2300	4
879	1490	10-Oct-09	19-Nov-10	2	2
879	1490	10-Oct-09	19-Nov-10	2	2
879	1490	16-Jun-14	20-Aug-14	2300	3



Output required
ID_1	BAL_DATE	T1	T2	T3	T4	T1PER	T2PER	T3PER	T4PER	T1_DERIVED	T2_DERIVED	T3_DERIVED	T4_DERIVED	REFAM	BM	BUK_ID	T2MAX
1234	01-Jan-08	195	0	0	0	0	14.628	0	24.582	0	0.07815	0	0	-5000	2300	1	5000
1234	02-Jan-08	200	10	0	0	0	14.628	0	24.582	0	0.084161	0	0	-5000	2300	1	5000
1234	03-Jan-08	0	25	0	185	0	14.628	0	24.582	0	0.010019	0	0.124594	-25	2300	1	5000
1234	04-Jan-08	0	25	0	30	0	14.628	0	24.582	0	0.010019	0	0.020204	-25	2300	1	5000
1234	14-Oct-09	25	0	0	170	0	14.013	0	0	0	0	0	0	-25	2	2	5000
1234	16-Oct-09	25	0	0	185	0	14.013	0	0	0	0	0	0	-25	2	2	5000
1234	16-Jun-14	15	195	0	0	0	0.75	1.5	3	0	0.75	0	0	-5000	2300	3	1000
1234	19-Jun-14	15	1000	985	0	0	0.75	1.5	3	0	0.75	1.5	3	-25	2300	3	1000



Query i have used
SELECT ID_1,
    BAL_DATE,
    T1,
    T2,
    case when BAL_DATE >= date '2014-06-15' then 
    LEAST (t3val, GREATEST (BAL - t1val - t2val, 0)) else 0  end T3,
    case when BAL_DATE >= date '2014-06-15' then 
    LEAST (t3val, GREATEST (BAL - t1val - t2val-t3val, 0)) else GREATEST(BAL -(T1 + T2),0) end T4,
    T1PER,
    T2PER,
    T3PER,
    T4PER,
    case when BAL_DATE >= date '2014-06-15' then T1PER else  ROUND((T1                      * T1PER) /(365 * 100),6)  end T1_derived,
    case when BAL_DATE >= date '2014-06-15' then T2PER else ROUND((T2                      * T2PER) /(365 * 100),6) end T2_derived,
    case when BAL_DATE >= date '2014-06-15'  then T3PER else  0 end T3_derived,
    case when BAL_DATE >= date '2014-06-15' then T4PER else  ROUND((GREATEST(BAL -(T1 + T2),0) * T4PER) /(365 * 100),6) end T4_derived,
    REFAM,
    BM,
    buk_id,
    T2MAX
  FROM
    (SELECT ID_1,
        BAL_DATE,
        BAL,
        REFAM,
      T1,
     case when BAL_DATE >= date '2014-06-15' then 
     LEAST (t2val, GREATEST (BAL - t1val, 0)) else
      GREATEST(LEAST(T2VAL,BAL - T1,DECODE(SIGN(REFAM),1,0,ABS(REFAM)) - T1),0) end T2,
      T1PER,
      T2PER,
      T3PER,
      T4PER,
      BM,
      buk_id,
      T2MAX,t2val,T1VAL,T3VAL
    FROM
      (SELECT ID_1,
        BAL_DATE,
        BAL,
        REFAM,
         case when BAL_DATE >= date '2014-06-15' then 
         LEAST (t1val, BAL) else
         LEAST(T1VAL,BAL,DECODE(SIGN(REFAM),1,0,ABS(REFAM))) end T1,
        NVL(T2VAL,0) T2VAL,
         case when BAL_DATE >= date '2014-06-15' then T1CHARGE
         else T1PER end T1PER,
        case when BAL_DATE >= date '2014-06-15' then T2CHARGE else T2PER end T2PER,
        case when BAL_DATE >= date '2014-06-15' then T3CHARGE else 0 end T3PER,
        case when BAL_DATE >= date '2014-06-15' then T4CHARGE else T4PER end T4PER,
        BM,
        buk_id,
        T2VAL T2MAX,T1VAL,T3VAL
      FROM
        (SELECT TB.ID ID_1,
          TB.BAL_DATE BAL_DATE,
          ROUND(ABS(TB.BAL)) BAL,
          DECODE(SIGN(TB.LIMIT_AMOUT), - 1,TB.LIMIT_AMOUT,NVL(TB.LIMIT_AMOUT,0)) REFAM,
          MAX(DECODE(TRIM(REF.TYPE),'T1',REF.MAX_AMT)) T1VAL,
          MAX(DECODE(TRIM(REF.TYPE),'T2',REF.MAX_AMT)) T2VAL,
          MAX(DECODE(TRIM(REF.TYPE),'T3',REF.MAX_AMT))T3VAL,
          MAX(DECODE(TRIM(REF.TYPE),'T4',REF.MAX_AMT))T4VAL,
          MAX(DECODE(TRIM(REF.TYPE),'T1',REF.RATE)) T1PER,
          MAX(DECODE(TRIM(REF.TYPE),'T2',REF.RATE)) T2PER,
          MAX(DECODE(TRIM(REF.TYPE),'T4',REF.RATE)) T4PER,
          MAX(DECODE(TRIM(REF.TYPE),'T1',REF.CHARGE)) T1CHARGE,
          MAX(DECODE(TRIM(REF.TYPE),'T2',REF.CHARGE)) T2CHARGE,
          MAX(DECODE(TRIM(REF.TYPE),'T3',REF.CHARGE)) T3CHARGE,
          MAX(DECODE(TRIM(REF.TYPE),'T4',REF.CHARGE)) T4CHARGE,
          BKT.product BM,
          bkt.buk_id buk_id
        FROM BALANCE TB,
          Reference_table REF,
          (SELECT DISTINCT start_date,
            end_date,
            product,buk_id
          FROM bucket BK
          WHERE id            = 879 and code <>3333
          ) BKT
        WHERE TB.BAL_DATE BETWEEN REF.EFF_FROM_DATE AND REF.EFF_TO_DATE
        AND TB.BAL_DATE BETWEEN BKT.start_date AND BKT.end_date
        AND BKT.product       = REF.product
        AND TB.ID = 1234
        GROUP BY TB.ID,
          TB.BAL_DATE,
          TB.BAL,
          TB.LIMIT_AMOUT,
          BKT.product,
          bkt.buk_id
        )
      )
    )
    order by BAL_DATE;


1 Check the bal_date which falls between start and end dates of bucket , here it falls in 1 and 4 buk_id, but need to ignore if code is 3333, hence below record will be selected
879 1490 16-Nov-07 09-Oct-09 2300 1
2 Take the product and compare with reference table where it falls in below periods
2300 10-Jun-02 01-Jun-08 T1 0 0 0
2300 10-Jun-02 01-Jun-08 T2 1 5000 14.628
2300 10-Jun-02 01-Jun-08 T4 24.582
3 Since the bal_date is falling in bucket table of code 3333 then consider below ranges
2300 10-Jun-02 01-Jun-08 T1 0 200 0
2300 10-Jun-02 01-Jun-08 T2 201 5000 14.628
2300 10-Jun-02 01-Jun-08 T4 24.582

4 Split the balance
ID_1 BAL_DATE T1 T2 T3 T4 T1PER T2PER T4PER T1_DERIVED T2_DERIVED T4_DERIVED REFAM BM BUK_ID T2MAX
1234 01-Jan-08 195 0 0 0 0 14.628 24.582 0 0.07815 0 -5000 2300 1 5000
T1_DERIVED T1*T1PER/365
T2_DERIVED T2*T2PER/365
T4_DERIVED T4*T4PER/365
Re: To Split data based on dates [message #643643 is a reply to message #643632] Wed, 14 October 2015 14:27 Go to previous messageGo to next message
rohit_shinez
Messages: 139
Registered: January 2015
Senior Member
Guys can any one advise??

Scripts for test case

Insert into balance (ID,BAL_DATE,BAL,LIMIT_AMOUT) values (1234,to_date('01-JAN-08','DD-MON-RR'),-195.34,-5000);
Insert into balance (ID,BAL_DATE,BAL,LIMIT_AMOUT) values (1234,to_date('02-JAN-08','DD-MON-RR'),-209.84,-5000);
Insert into balance (ID,BAL_DATE,BAL,LIMIT_AMOUT) values (1234,to_date('03-JAN-08','DD-MON-RR'),-209.84,-25);
Insert into balance (ID,BAL_DATE,BAL,LIMIT_AMOUT) values (1234,to_date('04-JAN-08','DD-MON-RR'),-54.96,-25);
Insert into balance (ID,BAL_DATE,BAL,LIMIT_AMOUT) values (1234,to_date('14-OCT-09','DD-MON-RR'),-195.34,-25);
Insert into balance (ID,BAL_DATE,BAL,LIMIT_AMOUT) values (1234,to_date('16-OCT-09','DD-MON-RR'),-209.84,-25);
Insert into balance (ID,BAL_DATE,BAL,LIMIT_AMOUT) values (1234,to_date('15-JUN-14','DD-MON-RR'),-195.34,-5000);
Insert into balance (ID,BAL_DATE,BAL,LIMIT_AMOUT) values (1234,to_date('16-JUN-14','DD-MON-RR'),-209.84,-5000);
Insert into balance (ID,BAL_DATE,BAL,LIMIT_AMOUT) values (1234,to_date('19-JUN-14','DD-MON-RR'),-2000.34,-25);


Insert into reference_table (PRODUCT,EFF_FROM_DATE,EFF_TO_DATE,TYPE,MIN_AMT,MAX_AMT,RATE,CHARGE) values (2300,to_date('16-JUN-14','DD-MON-RR'),to_date('31-DEC-99','DD-MON-RR'),'T1',0,15,null,0);
Insert into reference_table (PRODUCT,EFF_FROM_DATE,EFF_TO_DATE,TYPE,MIN_AMT,MAX_AMT,RATE,CHARGE) values (2300,to_date('16-JUN-14','DD-MON-RR'),to_date('31-DEC-99','DD-MON-RR'),'T2',16,1000,null,0.75);
Insert into reference_table (PRODUCT,EFF_FROM_DATE,EFF_TO_DATE,TYPE,MIN_AMT,MAX_AMT,RATE,CHARGE) values (2300,to_date('16-JUN-14','DD-MON-RR'),to_date('31-DEC-99','DD-MON-RR'),'T3',1001,2000,null,1.5);
Insert into reference_table (PRODUCT,EFF_FROM_DATE,EFF_TO_DATE,TYPE,MIN_AMT,MAX_AMT,RATE,CHARGE) values (2300,to_date('16-JUN-14','DD-MON-RR'),to_date('31-DEC-99','DD-MON-RR'),'T4',2001,5000,null,3);
Insert into reference_table (PRODUCT,EFF_FROM_DATE,EFF_TO_DATE,TYPE,MIN_AMT,MAX_AMT,RATE,CHARGE) values (2300,to_date('10-JUN-02','DD-MON-RR'),to_date('01-JUN-08','DD-MON-RR'),'T1',0,0,0,null);
Insert into reference_table (PRODUCT,EFF_FROM_DATE,EFF_TO_DATE,TYPE,MIN_AMT,MAX_AMT,RATE,CHARGE) values (2300,to_date('08-JUN-09','DD-MON-RR'),to_date('12-JAN-11','DD-MON-RR'),'T1',0,0,0,null);
Insert into reference_table (PRODUCT,EFF_FROM_DATE,EFF_TO_DATE,TYPE,MIN_AMT,MAX_AMT,RATE,CHARGE) values (2300,to_date('10-JUN-02','DD-MON-RR'),to_date('01-JUN-08','DD-MON-RR'),'T2',1,5000,14.628,null);
Insert into reference_table (PRODUCT,EFF_FROM_DATE,EFF_TO_DATE,TYPE,MIN_AMT,MAX_AMT,RATE,CHARGE) values (2300,to_date('08-JUN-09','DD-MON-RR'),to_date('12-JAN-11','DD-MON-RR'),'T2',1,5000,17.82,null);
Insert into reference_table (PRODUCT,EFF_FROM_DATE,EFF_TO_DATE,TYPE,MIN_AMT,MAX_AMT,RATE,CHARGE) values (2300,to_date('10-JUN-02','DD-MON-RR'),to_date('01-JUN-08','DD-MON-RR'),'T4',null,null,24.582,null);
Insert into reference_table (PRODUCT,EFF_FROM_DATE,EFF_TO_DATE,TYPE,MIN_AMT,MAX_AMT,RATE,CHARGE) values (2300,to_date('08-JUN-09','DD-MON-RR'),to_date('12-JAN-11','DD-MON-RR'),'T4',null,null,0,null);
Insert into reference_table (PRODUCT,EFF_FROM_DATE,EFF_TO_DATE,TYPE,MIN_AMT,MAX_AMT,RATE,CHARGE) values (2,to_date('10-JUN-02','DD-MON-RR'),to_date('17-AUG-08','DD-MON-RR'),'T2',251,5000,11.431,null);
Insert into reference_table (PRODUCT,EFF_FROM_DATE,EFF_TO_DATE,TYPE,MIN_AMT,MAX_AMT,RATE,CHARGE) values (2,to_date('10-JUN-02','DD-MON-RR'),to_date('17-AUG-08','DD-MON-RR'),'T1',0,250,0,null);
Insert into reference_table (PRODUCT,EFF_FROM_DATE,EFF_TO_DATE,TYPE,MIN_AMT,MAX_AMT,RATE,CHARGE) values (2,to_date('10-JUN-02','DD-MON-RR'),to_date('17-AUG-08','DD-MON-RR'),'T4',null,null,24.582,null);
Insert into reference_table (PRODUCT,EFF_FROM_DATE,EFF_TO_DATE,TYPE,MIN_AMT,MAX_AMT,RATE,CHARGE) values (2,to_date('08-JUN-09','DD-MON-RR'),to_date('29-OCT-09','DD-MON-RR'),'T1',0,250,0,null);
Insert into reference_table (PRODUCT,EFF_FROM_DATE,EFF_TO_DATE,TYPE,MIN_AMT,MAX_AMT,RATE,CHARGE) values (2,to_date('08-JUN-09','DD-MON-RR'),to_date('29-OCT-09','DD-MON-RR'),'T2',251,5000,14.013,null);
Insert into reference_table (PRODUCT,EFF_FROM_DATE,EFF_TO_DATE,TYPE,MIN_AMT,MAX_AMT,RATE,CHARGE) values (2,to_date('08-JUN-09','DD-MON-RR'),to_date('29-OCT-09','DD-MON-RR'),'T4',null,null,0,null);

Insert into bucket (ID,CODE,START_DATE,END_DATE,PRODUCT,BUK_ID) values ('879',1490,to_date('16-NOV-07','DD-MON-RR'),to_date('09-OCT-09','DD-MON-RR'),'2300',1);
Insert into bucket (ID,CODE,START_DATE,END_DATE,PRODUCT,BUK_ID) values ('879',3333,to_date('20-NOV-07','DD-MON-RR'),to_date('08-OCT-09','DD-MON-RR'),'2300',4);
Insert into bucket (ID,CODE,START_DATE,END_DATE,PRODUCT,BUK_ID) values ('879',1490,to_date('10-OCT-09','DD-MON-RR'),to_date('19-NOV-10','DD-MON-RR'),'2',2);
Insert into bucket (ID,CODE,START_DATE,END_DATE,PRODUCT,BUK_ID) values ('879',1490,to_date('10-OCT-09','DD-MON-RR'),to_date('19-NOV-10','DD-MON-RR'),'2',2);
Insert into bucket (ID,CODE,START_DATE,END_DATE,PRODUCT,BUK_ID) values ('879',1490,to_date('16-JUN-14','DD-MON-RR'),to_date('20-AUG-14','DD-MON-RR'),'2300',3);
 
commit;

[Updated on: Wed, 14 October 2015 14:57]

Report message to a moderator

Re: To Split data based on dates [message #643676 is a reply to message #643643] Thu, 15 October 2015 04:28 Go to previous messageGo to next message
rohit_shinez
Messages: 139
Registered: January 2015
Senior Member
Guys any one help
Re: To Split data based on dates [message #643701 is a reply to message #643676] Thu, 15 October 2015 15:17 Go to previous messageGo to next message
rohit_shinez
Messages: 139
Registered: January 2015
Senior Member
Guys can any one help
Re: To Split data based on dates [message #643793 is a reply to message #643701] Sun, 18 October 2015 15:34 Go to previous messageGo to next message
Barbara Boehmer
Messages: 9106
Registered: November 2002
Location: California, USA
Senior Member
I have reviewed this post and the one on the OTN forums ( https://community.oracle.com/thread/3801794 ). You have done a good job of providing statements to create the tables and insert sample data and shown the results that you want and what you have tried. I ran what you have tried and compared it to what you want and it looks like only the T1, T2, and T4 values are different from what you want. However, I am unable to understand how the desired results should be obtained. The inline views (sub-queries in the from clause) that you are using are a good method for processing such step by step things, where the innermost sub-query is the first step and the outermost query obtains the final results. What you might try doing is testing one sub-query at a time, starting with just the innermost, then the next one, and so on, and see at what point the results are not what you expect. Starting with the first row, I can't see where you get 195 for T1 instead of T2. I can't tell if you have made an error in your desired results or if your explanation or query is wrong.

Re: To Split data based on dates [message #643794 is a reply to message #643793] Sun, 18 October 2015 17:21 Go to previous messageGo to next message
rohit_shinez
Messages: 139
Registered: January 2015
Senior Member
Thanks barbara for responding, actually i have changed my test cases , what i want to check is if bal_date is falling between start and end dates of bucket table where code starts with 3 or to be precise i will configure the codes in lookup table then make the T2 value as 200 instead of taking MAX(DECODE(TRIM(REF.TYPE),'T1',REF.MAX_AMT)) T1VAL, only if bal_date falling between the start dates of buckets.

something like this while comparing the dates i shouldnt consider the codes which is present in lookup table but for determining the T1val i should check if led_bal falling for those codes then make t1VAL as 200
SELECT DISTINCT start_date,
            end_date,
            product,buk_id
          FROM bucket BK
          WHERE id            = 879 and [b]code not in (select id from lookup_tab)[/b]


final output
ID	BAL_DATE	BAL	LIMIT_AMOUT
1234	01-JAN-08 00.00.00	-195.34	-5000
1234	02-JAN-08 00.00.00	-6000	-5000
1234	03-JAN-08 00.00.00	-209.84	-25
1234	04-JAN-08 00.00.00	-54.96	-25
1234	14-OCT-09 00.00.00	-195.34	-25
1234	16-OCT-09 00.00.00	-209.84	-25
1234	15-JUN-14 00.00.00	-195.34	-5000
1234	16-JUN-14 00.00.00	-2000	-5000
1234	19-JUN-14 00.00.00	-5500	-25

bucket table 

ID	CODE	START_DATE	END_DATE	PRODUCT	BUK_ID
879	1490	16-NOV-07 00.00.00	09-OCT-09 00.00.00	2300	1
879	3333	20-NOV-07 00.00.00	08-OCT-08 00.00.00	2300	4
879	3334	09-OCT-08 00.00.00	08-OCT-09 00.00.00	2300	4
879	1490	10-OCT-09 00.00.00	19-NOV-10 00.00.00	2	2
879	1490	10-OCT-09 00.00.00	19-NOV-10 00.00.00	2	2
879	1490	16-JUN-14 00.00.00	20-AUG-14 00.00.00	2300	3


final output

ID_1	BAL_DATE	T1	T2	T3	T4	T1PER	T2PER	T3PER	T4PER	T1_DERIVED	T2_DERIVED	T3_DERIVED	T4_DERIVED	REFAM	BM	BUK_ID	T2MAX
1234	01-JAN-08 00.00.00	195	0	0	0	0	14.628	0	24.582	0	0.07815	0	0	-5000	2300	1	5000
1234	02-JAN-08 00.00.00	200	4800	0	1000	0	14.628	0	24.582	0	2.003836	0	0.673479	-5000	2300	1	5000
1234	03-JAN-08 00.00.00	25	0	0	185	0	14.628	0	24.582	0	0.010019	0	0.124594	-25	2300	1	5000
1234	04-JAN-08 00.00.00	25	0	0	30	0	14.628	0	24.582	0	0.010019	0	0.020204	-25	2300	1	5000
1234	14-OCT-09 00.00.00	25	0	0	170	0	14.013	0	0	0	0	0	0	-25	2	2	5000
1234	16-OCT-09 00.00.00	25	0	0	185	0	14.013	0	0	0	0	0	0	-25	2	2	5000
1234	16-JUN-14 00.00.00	15	1000	985	0	0	0.75	1.5	3	0	0.75	1.5	0	-5000	2300	3	1000
1234	19-JUN-14 00.00.00	15	1000	2000	2485	0	0.75	1.5	3	0	0.75	1.5	3	-25	2300	3	1000

updated scripts:

Insert into balance (ID,BAL_DATE,BAL,LIMIT_AMOUT) values (1234,to_date('01-JAN-08 00.00.00','DD-MON-RR HH24.MI.SS'),-195.34,-5000);
Insert into balance (ID,BAL_DATE,BAL,LIMIT_AMOUT) values (1234,to_date('02-JAN-08 00.00.00','DD-MON-RR HH24.MI.SS'),-6000,-5000);
Insert into balance (ID,BAL_DATE,BAL,LIMIT_AMOUT) values (1234,to_date('03-JAN-08 00.00.00','DD-MON-RR HH24.MI.SS'),-209.84,-25);
Insert into balance (ID,BAL_DATE,BAL,LIMIT_AMOUT) values (1234,to_date('04-JAN-08 00.00.00','DD-MON-RR HH24.MI.SS'),-54.96,-25);
Insert into balance (ID,BAL_DATE,BAL,LIMIT_AMOUT) values (1234,to_date('14-OCT-09 00.00.00','DD-MON-RR HH24.MI.SS'),-195.34,-25);
Insert into balance (ID,BAL_DATE,BAL,LIMIT_AMOUT) values (1234,to_date('16-OCT-09 00.00.00','DD-MON-RR HH24.MI.SS'),-209.84,-25);
Insert into balance (ID,BAL_DATE,BAL,LIMIT_AMOUT) values (1234,to_date('15-JUN-14 00.00.00','DD-MON-RR HH24.MI.SS'),-195.34,-5000);
Insert into balance (ID,BAL_DATE,BAL,LIMIT_AMOUT) values (1234,to_date('16-JUN-14 00.00.00','DD-MON-RR HH24.MI.SS'),-2000,-5000);
Insert into balance (ID,BAL_DATE,BAL,LIMIT_AMOUT) values (1234,to_date('19-JUN-14 00.00.00','DD-MON-RR HH24.MI.SS'),-5500,-25);

Insert into bucket (ID,CODE,START_DATE,END_DATE,PRODUCT,BUK_ID) values ('879',1490,to_date('16-NOV-07 00.00.00','DD-MON-RR HH24.MI.SS'),to_date('09-OCT-09 00.00.00','DD-MON-RR HH24.MI.SS'),'2300',1);
Insert into bucket (ID,CODE,START_DATE,END_DATE,PRODUCT,BUK_ID) values ('879',3333,to_date('20-NOV-07 00.00.00','DD-MON-RR HH24.MI.SS'),to_date('08-OCT-08 00.00.00','DD-MON-RR HH24.MI.SS'),'2300',4);
Insert into bucket (ID,CODE,START_DATE,END_DATE,PRODUCT,BUK_ID) values ('879',3334,to_date('09-OCT-08 00.00.00','DD-MON-RR HH24.MI.SS'),to_date('08-OCT-09 00.00.00','DD-MON-RR HH24.MI.SS'),'2300',4);
Insert into bucket (ID,CODE,START_DATE,END_DATE,PRODUCT,BUK_ID) values ('879',1490,to_date('10-OCT-09 00.00.00','DD-MON-RR HH24.MI.SS'),to_date('19-NOV-10 00.00.00','DD-MON-RR HH24.MI.SS'),'2',2);
Insert into bucket (ID,CODE,START_DATE,END_DATE,PRODUCT,BUK_ID) values ('879',1490,to_date('10-OCT-09 00.00.00','DD-MON-RR HH24.MI.SS'),to_date('19-NOV-10 00.00.00','DD-MON-RR HH24.MI.SS'),'2',2);
Insert into bucket (ID,CODE,START_DATE,END_DATE,PRODUCT,BUK_ID) values ('879',1490,to_date('16-JUN-14 00.00.00','DD-MON-RR HH24.MI.SS'),to_date('20-AUG-14 00.00.00','DD-MON-RR HH24.MI.SS'),'2300',3);


create table lookup_tab(id number);

insert into lookup_tab
select 3333 from dual
union all
select 3334 from dual;


query i have used
select ID_1,
 BAL_DATE,
    T1,
    T2,
    T3,
    T4,
     T1PER,
    T2PER,
    T3PER,
    T4PER,
    case when BAL_DATE >= date '2014-06-15' and T1 = 0 then 0 else T1_derived end T1_derived,
     case when BAL_DATE >= date '2014-06-15' and T2 = 0 then 0 else T2_derived end T2_derived,
      case when BAL_DATE >= date '2014-06-15' and T3 = 0 then 0 else T3_derived end T3_derived,
       case when BAL_DATE >= date '2014-06-15' and T4 = 0 then 0 else T4_derived end T4_derived,
       REFAM,
    BM,
    buk_id,
    T2MAX
    from (
SELECT ID_1,
    BAL_DATE,
    T1,
    T2,
    case when BAL_DATE >= date '2014-06-15' then 
    LEAST (t3val, GREATEST (BAL - t1val - t2val, 0)) else 0  end T3,
    case when BAL_DATE >= date '2014-06-15' then 
    LEAST (t4val, GREATEST (BAL - t1val - t2val-t3val, 0)) else GREATEST(BAL -(T1 + T2),0) end T4,
    T1PER,
    T2PER,
    T3PER,
    T4PER,
    case when BAL_DATE >= date '2014-06-15' then T1PER else  ROUND((T1                      * T1PER) /(365 * 100),6)  end T1_derived,
    case when BAL_DATE >= date '2014-06-15' then T2PER else ROUND((T2                      * T2PER) /(365 * 100),6) end T2_derived,
    case when BAL_DATE >= date '2014-06-15'  then T3PER else  0 end T3_derived,
    case when BAL_DATE >= date '2014-06-15' then T4PER else  ROUND((GREATEST(BAL -(T1 + T2),0) * T4PER) /(365 * 100),6) end T4_derived,
    REFAM,
    BM,
    buk_id,
    T2MAX
  FROM
    (SELECT ID_1,
        BAL_DATE,
        BAL,
        REFAM,
      T1,
     case when BAL_DATE >= date '2014-06-15' then 
     LEAST (t2val, GREATEST (BAL - t1val, 0)) else
      GREATEST(LEAST(T2VAL,BAL - T1,DECODE(SIGN(REFAM),1,0,ABS(REFAM)) - T1),0) end T2,
      T1PER,
      T2PER,
      T3PER,
      T4PER,
      BM,
      buk_id,
      T2MAX,t2val,T1VAL,T3VAL,T4VAL
    FROM
      (SELECT ID_1,
        BAL_DATE,
        BAL,
        REFAM,
         case when BAL_DATE >= date '2014-06-15' then 
         LEAST (t1val, BAL) else
         LEAST(T1VAL,BAL,DECODE(SIGN(REFAM),1,0,ABS(REFAM))) end T1,
        NVL(T2VAL,0) T2VAL,
         case when BAL_DATE >= date '2014-06-15' then T1CHARGE
         else T1PER end T1PER,
        case when BAL_DATE >= date '2014-06-15' then T2CHARGE else T2PER end T2PER,
        case when BAL_DATE >= date '2014-06-15' then T3CHARGE else 0 end T3PER,
        case when BAL_DATE >= date '2014-06-15' then T4CHARGE else T4PER end T4PER,
        BM,
        buk_id,
        T2VAL T2MAX,T1VAL,T3VAL,T4VAL
      FROM
        (SELECT TB.ID ID_1,
          TB.BAL_DATE BAL_DATE,
          ROUND(ABS(TB.BAL)) BAL,
          DECODE(SIGN(TB.LIMIT_AMOUT), - 1,TB.LIMIT_AMOUT,NVL(TB.LIMIT_AMOUT,0)) REFAM,
          MAX(DECODE(TRIM(REF.TYPE),'T1',REF.MAX_AMT)) T1VAL,
          MAX(DECODE(TRIM(REF.TYPE),'T2',REF.MAX_AMT)) T2VAL,
          MAX(DECODE(TRIM(REF.TYPE),'T3',REF.MAX_AMT))T3VAL,
          MAX(DECODE(TRIM(REF.TYPE),'T4',REF.MAX_AMT))T4VAL,
          MAX(DECODE(TRIM(REF.TYPE),'T1',REF.RATE)) T1PER,
          MAX(DECODE(TRIM(REF.TYPE),'T2',REF.RATE)) T2PER,
          MAX(DECODE(TRIM(REF.TYPE),'T4',REF.RATE)) T4PER,
          MAX(DECODE(TRIM(REF.TYPE),'T1',REF.CHARGE)) T1CHARGE,
          MAX(DECODE(TRIM(REF.TYPE),'T2',REF.CHARGE)) T2CHARGE,
          MAX(DECODE(TRIM(REF.TYPE),'T3',REF.CHARGE)) T3CHARGE,
          MAX(DECODE(TRIM(REF.TYPE),'T4',REF.CHARGE)) T4CHARGE,
          BKT.product BM,
          bkt.buk_id buk_id
        FROM BALANCE TB,
          Reference_table REF,
          (SELECT DISTINCT start_date,
            end_date,
            product,buk_id
          FROM bucket BK
          WHERE id            = 879 and code <>3333
          ) BKT
        WHERE TB.BAL_DATE BETWEEN REF.EFF_FROM_DATE AND REF.EFF_TO_DATE
        AND TB.BAL_DATE BETWEEN BKT.start_date AND BKT.end_date
        AND BKT.product       = REF.product
        AND TB.ID = 1234
        GROUP BY TB.ID,
          TB.BAL_DATE,
          TB.BAL,
          TB.LIMIT_AMOUT,
          BKT.product,
          bkt.buk_id
        )
      )
    )
    )
    order by BAL_DATE;

[Updated on: Sun, 18 October 2015 17:22]

Report message to a moderator

Re: To Split data based on dates [message #643833 is a reply to message #643794] Mon, 19 October 2015 12:35 Go to previous messageGo to next message
Barbara Boehmer
Messages: 9106
Registered: November 2002
Location: California, USA
Senior Member
Your problem is still unclear. You have provided a lookup_tab and yet not used that in your query. You don't indicate what part of the results that you are getting are not what you want. You have not shown at what point you get incorrect results. As I said before, you need to test each sub-query, one at a time and find at which point you begin to get undesirable results.
Re: To Split data based on dates [message #643835 is a reply to message #643833] Mon, 19 October 2015 14:40 Go to previous messageGo to next message
rohit_shinez
Messages: 139
Registered: January 2015
Senior Member
HI Barbara,

Please find the updated query considering below updated tables


delete from bucket where code like '3%';

bucket table:

ID	CODE	START_DATE	END_DATE	PRODUCT	BUK_ID
879	1490	16-NOV-07 00.00.00	09-OCT-09 00.00.00	2300	1
879	1490	10-OCT-09 00.00.00	19-NOV-10 00.00.00	2	2
879	1490	10-OCT-09 00.00.00	19-NOV-10 00.00.00	2	2
879	1490	16-JUN-14 00.00.00	20-AUG-14 00.00.00	2300	3


adding another reference table to check if the bar_date falls between dates then make t1val as 200

ref_final_table

Insert into ref_final_table (ID,CODE,START_DATE,END_DATE,PRODUCT,BUK_ID) values ('879',3333,to_date('20-NOV-07 00.00.00','DD-MON-RR HH24.MI.SS'),to_date('08-OCT-08 00.00.00','DD-MON-RR HH24.MI.SS'),'2300',4);
Insert into ref_final_table (ID,CODE,START_DATE,END_DATE,PRODUCT,BUK_ID) values ('879',3334,to_date('09-OCT-08 00.00.00','DD-MON-RR HH24.MI.SS'),to_date('08-OCT-09 00.00.00','DD-MON-RR HH24.MI.SS'),'2300',4);

query i have used

select ID_1,
 BAL_DATE,
    T1,
    T2,
    T3,
    T4,
     T1PER,
    T2PER,
    T3PER,
    T4PER,
    case when BAL_DATE >= date '2014-06-15' and T1 = 0 then 0 else T1_derived end T1_derived,
     case when BAL_DATE >= date '2014-06-15' and T2 = 0 then 0 else T2_derived end T2_derived,
      case when BAL_DATE >= date '2014-06-15' and T3 = 0 then 0 else T3_derived end T3_derived,
       case when BAL_DATE >= date '2014-06-15' and T4 = 0 then 0 else T4_derived end T4_derived,
       REFAM,
    BM,
    buk_id,
    T2MAX
    from (
SELECT ID_1,
    BAL_DATE,
    T1,
    T2,
    case when BAL_DATE >= date '2014-06-15' then 
    LEAST (t3val, GREATEST (BAL - t1val - t2val, 0)) else 0  end T3,
    case when BAL_DATE >= date '2014-06-15' then 
    LEAST (t4val, GREATEST (BAL - t1val - t2val-t3val, 0)) else GREATEST(BAL -(T1 + T2),0) end T4,
    T1PER,
    T2PER,
    T3PER,
    T4PER,
    case when BAL_DATE >= date '2014-06-15' then T1PER else  ROUND((T1                      * T1PER) /(365 * 100),6)  end T1_derived,
    case when BAL_DATE >= date '2014-06-15' then T2PER else ROUND((T2                      * T2PER) /(365 * 100),6) end T2_derived,
    case when BAL_DATE >= date '2014-06-15'  then T3PER else  0 end T3_derived,
    case when BAL_DATE >= date '2014-06-15' then T4PER else  ROUND((GREATEST(BAL -(T1 + T2),0) * T4PER) /(365 * 100),6) end T4_derived,
    REFAM,
    BM,
    buk_id,
    T2MAX
  FROM
    (SELECT ID_1,
        BAL_DATE,
        BAL,
        REFAM,
      T1,
     case when BAL_DATE >= date '2014-06-15' then 
     LEAST (t2val, GREATEST (BAL - t1val, 0)) else
      GREATEST(LEAST(T2VAL,BAL - T1,DECODE(SIGN(REFAM),1,0,ABS(REFAM)) - T1),0) end T2,
      T1PER,
      T2PER,
      T3PER,
      T4PER,
      BM,
      buk_id,
      T2MAX,t2val,T1VAL,T3VAL,T4VAL
    FROM
      (SELECT ID_1,
        BAL_DATE,
        BAL,
        REFAM,
         case when BAL_DATE >= date '2014-06-15' then 
         LEAST (t1val, BAL) else
         LEAST(T1VAL,BAL,DECODE(SIGN(REFAM),1,0,ABS(REFAM))) end T1,
        NVL(T2VAL,0) T2VAL,
         case when BAL_DATE >= date '2014-06-15' then T1CHARGE
         else T1PER end T1PER,
        case when BAL_DATE >= date '2014-06-15' then T2CHARGE else T2PER end T2PER,
        case when BAL_DATE >= date '2014-06-15' then T3CHARGE else 0 end T3PER,
        case when BAL_DATE >= date '2014-06-15' then T4CHARGE else T4PER end T4PER,
        BM,
        buk_id,
        T2VAL T2MAX,T1VAL,T3VAL,T4VAL
      FROM
        (SELECT TB.ID ID_1,
          TB.BAL_DATE BAL_DATE,
          ROUND(ABS(TB.BAL)) BAL,
          DECODE(SIGN(TB.LIMIT_AMOUT), - 1,TB.LIMIT_AMOUT,NVL(TB.LIMIT_AMOUT,0)) REFAM,
          MAX(DECODE(TRIM(REF.TYPE),'T1',REF.MAX_AMT)) T1VAL,
          MAX(DECODE(TRIM(REF.TYPE),'T2',REF.MAX_AMT)) T2VAL,
          MAX(DECODE(TRIM(REF.TYPE),'T3',REF.MAX_AMT))T3VAL,
          MAX(DECODE(TRIM(REF.TYPE),'T4',REF.MAX_AMT))T4VAL,
          MAX(DECODE(TRIM(REF.TYPE),'T1',REF.RATE)) T1PER,
          MAX(DECODE(TRIM(REF.TYPE),'T2',REF.RATE)) T2PER,
          MAX(DECODE(TRIM(REF.TYPE),'T4',REF.RATE)) T4PER,
          MAX(DECODE(TRIM(REF.TYPE),'T1',REF.CHARGE)) T1CHARGE,
          MAX(DECODE(TRIM(REF.TYPE),'T2',REF.CHARGE)) T2CHARGE,
          MAX(DECODE(TRIM(REF.TYPE),'T3',REF.CHARGE)) T3CHARGE,
          MAX(DECODE(TRIM(REF.TYPE),'T4',REF.CHARGE)) T4CHARGE,
          BKT.product BM,
          bkt.buk_id buk_id
        FROM BALANCE TB,
          Reference_table REF,
          (SELECT DISTINCT start_date,
            end_date,
            product,buk_id
          FROM bucket BK
          WHERE id            = 879 
          ) BKT
        WHERE TB.BAL_DATE BETWEEN REF.EFF_FROM_DATE AND REF.EFF_TO_DATE
        AND TB.BAL_DATE BETWEEN BKT.start_date AND BKT.end_date
        AND BKT.product       = REF.product
        AND TB.ID = 1234
        GROUP BY TB.ID,
          TB.BAL_DATE,
          TB.BAL,
          TB.LIMIT_AMOUT,
          BKT.product,
          bkt.buk_id
        )
      )
    )
    )
    order by BAL_DATE;




i am struck how i can change the T1val to 200 if bad_date falls between dates ref_final_table to get below output showing only changed values

ID_1 BAL_DATE T1 T2 T3 T4 T1PER T2PER T3PER T4PER T1_DERIVED T2_DERIVED T3_DERIVED T4_DERIVED REFAM BM BUK_ID T2MAX
1234 01-JAN-08 00.00.00 195 0 0 0 0 14.628 0 24.582 0 0.07815 0 0 -5000 2300 1 5000
1234 02-JAN-08 00.00.00 200 4800 0 1000 0 14.628 0 24.582 0 2.003836 0 0.673479 -5000 2300 1 5000
1234 03-JAN-08 00.00.00 25 0 0 185 0 14.628 0 24.582 0 0.010019 0 0.124594 -25 2300 1 5000
1234 04-JAN-08 00.00.00 25 0 0 30 0 14.628 0 24.582 0 0.010019 0 0.020204 -25 2300 1 5000

Re: To Split data based on dates [message #643841 is a reply to message #643835] Mon, 19 October 2015 23:53 Go to previous messageGo to next message
Barbara Boehmer
Messages: 9106
Registered: November 2002
Location: California, USA
Senior Member
Your problem continues to be a changing bigger mess. You have now added another table that isn't used in your newest query. You say you want a different t1val, but the result you show does not contain the t1val. You need to do like I said before and test each level of sub-query one at a time and see at what point you get wrong results. If you are net getting a desired t1val, then you should be focusing on at least the lowest level sub-query that includes the t1 val.
Re: To Split data based on dates [message #643856 is a reply to message #643841] Tue, 20 October 2015 05:50 Go to previous messageGo to next message
rohit_shinez
Messages: 139
Registered: January 2015
Senior Member
Hi Barbara,

i need to change the t1val in below subquery when bal_date falls between dates of ref_final_table

SELECT TB.ID ID_1,
          TB.BAL_DATE BAL_DATE,
          ROUND(ABS(TB.BAL)) BAL,
          DECODE(SIGN(TB.LIMIT_AMOUT), - 1,TB.LIMIT_AMOUT,NVL(TB.LIMIT_AMOUT,0)) REFAM,
          MAX(DECODE(TRIM(REF.TYPE),'T1',REF.MAX_AMT)) T1VAL,
          MAX(DECODE(TRIM(REF.TYPE),'T2',REF.MAX_AMT)) T2VAL,
          MAX(DECODE(TRIM(REF.TYPE),'T3',REF.MAX_AMT))T3VAL,
          MAX(DECODE(TRIM(REF.TYPE),'T4',REF.MAX_AMT))T4VAL,
          MAX(DECODE(TRIM(REF.TYPE),'T1',REF.RATE)) T1PER,
          MAX(DECODE(TRIM(REF.TYPE),'T2',REF.RATE)) T2PER,
          MAX(DECODE(TRIM(REF.TYPE),'T4',REF.RATE)) T4PER,
          MAX(DECODE(TRIM(REF.TYPE),'T1',REF.CHARGE)) T1CHARGE,
          MAX(DECODE(TRIM(REF.TYPE),'T2',REF.CHARGE)) T2CHARGE,
          MAX(DECODE(TRIM(REF.TYPE),'T3',REF.CHARGE)) T3CHARGE,
          MAX(DECODE(TRIM(REF.TYPE),'T4',REF.CHARGE)) T4CHARGE,
          BKT.product BM,
          bkt.buk_id buk_id
        FROM BALANCE TB,
          Reference_table REF,
          (SELECT DISTINCT start_date,
            end_date,
            product,buk_id
          FROM bucket BK
          WHERE id            = 879 
          ) BKT
        WHERE TB.BAL_DATE BETWEEN REF.EFF_FROM_DATE AND REF.EFF_TO_DATE
        AND TB.BAL_DATE BETWEEN BKT.start_date AND BKT.end_date
        AND BKT.product       = REF.product
        AND TB.ID = 1234
        GROUP BY TB.ID,
          TB.BAL_DATE,
          TB.BAL,
          TB.LIMIT_AMOUT,
          BKT.product,
          bkt.buk_id

Re: To Split data based on dates [message #643893 is a reply to message #643856] Tue, 20 October 2015 14:53 Go to previous messageGo to next message
Barbara Boehmer
Messages: 9106
Registered: November 2002
Location: California, USA
Senior Member
Please note the differences between your sub-query below and my revised sub-query below that. This uses your most recent tables and insert statements on this thread.

-- your sub-query:
SCOTT@orcl12c> SELECT TB.ID ID_1,
  2  	    TB.BAL_DATE BAL_DATE,
  3  	    ROUND(ABS(TB.BAL)) BAL,
  4  	    DECODE(SIGN(TB.LIMIT_AMOUT), - 1,TB.LIMIT_AMOUT,NVL(TB.LIMIT_AMOUT,0)) REFAM,
  5  	    MAX(DECODE(TRIM(REF.TYPE),'T1',REF.MAX_AMT)) T1VAL,
  6  	    MAX(DECODE(TRIM(REF.TYPE),'T2',REF.MAX_AMT)) T2VAL,
  7  	    MAX(DECODE(TRIM(REF.TYPE),'T3',REF.MAX_AMT))T3VAL,
  8  	    MAX(DECODE(TRIM(REF.TYPE),'T4',REF.MAX_AMT))T4VAL,
  9  	    MAX(DECODE(TRIM(REF.TYPE),'T1',REF.RATE)) T1PER,
 10  	    MAX(DECODE(TRIM(REF.TYPE),'T2',REF.RATE)) T2PER,
 11  	    MAX(DECODE(TRIM(REF.TYPE),'T4',REF.RATE)) T4PER,
 12  	    MAX(DECODE(TRIM(REF.TYPE),'T1',REF.CHARGE)) T1CHARGE,
 13  	    MAX(DECODE(TRIM(REF.TYPE),'T2',REF.CHARGE)) T2CHARGE,
 14  	    MAX(DECODE(TRIM(REF.TYPE),'T3',REF.CHARGE)) T3CHARGE,
 15  	    MAX(DECODE(TRIM(REF.TYPE),'T4',REF.CHARGE)) T4CHARGE,
 16  	    BKT.product BM,
 17  	    bkt.buk_id buk_id
 18  FROM   BALANCE TB,
 19  	    Reference_table REF,
 20  	    (SELECT DISTINCT start_date,
 21  		    end_date,
 22  		    product, buk_id
 23  	     FROM   bucket BK
 24  	     WHERE  id = 879) BKT
 25  WHERE  TB.BAL_DATE BETWEEN REF.EFF_FROM_DATE AND REF.EFF_TO_DATE
 26  AND    TB.BAL_DATE BETWEEN BKT.start_date AND BKT.end_date
 27  AND    BKT.product = REF.product
 28  AND    TB.ID = 1234
 29  GROUP  BY TB.ID,
 30  	       TB.BAL_DATE,
 31  	       TB.BAL,
 32  	       TB.LIMIT_AMOUT,
 33  	       BKT.product,
 34  	       bkt.buk_id
 35  ORDER  BY bal_date
 36  /

      ID_1 BAL_DATE         BAL      REFAM      T1VAL      T2VAL      T3VAL      T4VAL      T1PER      T2PER      T4PER   T1CHARGE   T2CHARGE   T3CHARGE   T4CHARGE BM                       BUK_ID
---------- --------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- -------------------- ----------
      1234 01-JAN-08        195      -5000          0       5000                                0     14.628     24.582                                             2300                          1
      1234 01-JAN-08        195      -5000          0       5000                                0     14.628     24.582                                             2300                          4
      1234 02-JAN-08       6000      -5000          0       5000                                0     14.628     24.582                                             2300                          1
      1234 02-JAN-08       6000      -5000          0       5000                                0     14.628     24.582                                             2300                          4
      1234 03-JAN-08        210        -25          0       5000                                0     14.628     24.582                                             2300                          1
      1234 03-JAN-08        210        -25          0       5000                                0     14.628     24.582                                             2300                          4
      1234 04-JAN-08         55        -25          0       5000                                0     14.628     24.582                                             2300                          1
      1234 04-JAN-08         55        -25          0       5000                                0     14.628     24.582                                             2300                          4
      1234 14-OCT-09        195        -25        250       5000                                0     14.013          0                                             2                             2
      1234 16-OCT-09        210        -25        250       5000                                0     14.013          0                                             2                             2

10 rows selected.


-- revised sub-query:
SCOTT@orcl12c> SELECT TB.ID ID_1,
  2  	    TB.BAL_DATE BAL_DATE,
  3  	    ROUND(ABS(TB.BAL)) BAL,
  4  	    DECODE(SIGN(TB.LIMIT_AMOUT), - 1,TB.LIMIT_AMOUT,NVL(TB.LIMIT_AMOUT,0)) REFAM,
  5  	    case when tb.bal_date between rft.start_date and rft.end_date then 200 else
  6  	    MAX(DECODE(TRIM(REF.TYPE),'T1',REF.MAX_AMT)) end T1VAL,
  7  	    MAX(DECODE(TRIM(REF.TYPE),'T2',REF.MAX_AMT)) T2VAL,
  8  	    MAX(DECODE(TRIM(REF.TYPE),'T3',REF.MAX_AMT))T3VAL,
  9  	    MAX(DECODE(TRIM(REF.TYPE),'T4',REF.MAX_AMT))T4VAL,
 10  	    MAX(DECODE(TRIM(REF.TYPE),'T1',REF.RATE)) T1PER,
 11  	    MAX(DECODE(TRIM(REF.TYPE),'T2',REF.RATE)) T2PER,
 12  	    MAX(DECODE(TRIM(REF.TYPE),'T4',REF.RATE)) T4PER,
 13  	    MAX(DECODE(TRIM(REF.TYPE),'T1',REF.CHARGE)) T1CHARGE,
 14  	    MAX(DECODE(TRIM(REF.TYPE),'T2',REF.CHARGE)) T2CHARGE,
 15  	    MAX(DECODE(TRIM(REF.TYPE),'T3',REF.CHARGE)) T3CHARGE,
 16  	    MAX(DECODE(TRIM(REF.TYPE),'T4',REF.CHARGE)) T4CHARGE,
 17  	    BKT.product BM,
 18  	    bkt.buk_id buk_id
 19  FROM   BALANCE TB,
 20  	    Reference_table REF,
 21  	    (SELECT DISTINCT id, code, start_date,
 22  		    end_date,
 23  		    product, buk_id
 24  	     FROM   bucket BK
 25  	     WHERE  id = 879) BKT,
 26  	    ref_final_table rft
 27  WHERE  TB.BAL_DATE BETWEEN REF.EFF_FROM_DATE AND REF.EFF_TO_DATE
 28  AND    TB.BAL_DATE BETWEEN BKT.start_date AND BKT.end_date
 29  AND    BKT.product = REF.product
 30  AND    TB.ID = 1234
 31  and    rft.id = bkt.id
 32  and    rft.code = bkt.code
 33  GROUP  BY TB.ID,
 34  	       TB.BAL_DATE,
 35  	       TB.BAL,
 36  	       TB.LIMIT_AMOUT,
 37  	       BKT.product,
 38  	       bkt.buk_id,
 39  	       rft.start_date,
 40  	       rft.end_date
 41  ORDER  BY bal_date
 42  /

      ID_1 BAL_DATE         BAL      REFAM      T1VAL      T2VAL      T3VAL      T4VAL      T1PER      T2PER      T4PER   T1CHARGE   T2CHARGE   T3CHARGE   T4CHARGE BM                       BUK_ID
---------- --------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- -------------------- ----------
      1234 01-JAN-08        195      -5000        200       5000                                0     14.628     24.582                                             2300                          4
      1234 02-JAN-08       6000      -5000        200       5000                                0     14.628     24.582                                             2300                          4
      1234 03-JAN-08        210        -25        200       5000                                0     14.628     24.582                                             2300                          4
      1234 04-JAN-08         55        -25        200       5000                                0     14.628     24.582                                             2300                          4

4 rows selected.

Re: To Split data based on dates [message #643914 is a reply to message #643893] Wed, 21 October 2015 06:05 Go to previous messageGo to next message
rohit_shinez
Messages: 139
Registered: January 2015
Senior Member
Thanks barabara, i think below query will work because in ref_final_table the id will be different changed the table scripts
SELECT TB.ID ID_1,
          TB.BAL_DATE BAL_DATE,
          ROUND(ABS(TB.BAL)) BAL,
          DECODE(SIGN(TB.LIMIT_AMOUT), - 1,TB.LIMIT_AMOUT,NVL(TB.LIMIT_AMOUT,0)) REFAM,
          case when exists (select 1 from ref_final_table rft where tb.bal_date between rft.start_date and rft.end_date
          and rft.code in (select id from lookup_tab )) then 200 else MAX(DECODE(TRIM(REF.TYPE),'T1',REF.MAX_AMT)) end T1VAL,
          MAX(DECODE(TRIM(REF.TYPE),'T2',REF.MAX_AMT)) T2VAL,
          MAX(DECODE(TRIM(REF.TYPE),'T3',REF.MAX_AMT))T3VAL,
          MAX(DECODE(TRIM(REF.TYPE),'T4',REF.MAX_AMT))T4VAL,
          MAX(DECODE(TRIM(REF.TYPE),'T1',REF.RATE)) T1PER,
          MAX(DECODE(TRIM(REF.TYPE),'T2',REF.RATE)) T2PER,
          MAX(DECODE(TRIM(REF.TYPE),'T4',REF.RATE)) T4PER,
          MAX(DECODE(TRIM(REF.TYPE),'T1',REF.CHARGE)) T1CHARGE,
          MAX(DECODE(TRIM(REF.TYPE),'T2',REF.CHARGE)) T2CHARGE,
          MAX(DECODE(TRIM(REF.TYPE),'T3',REF.CHARGE)) T3CHARGE,
          MAX(DECODE(TRIM(REF.TYPE),'T4',REF.CHARGE)) T4CHARGE,
          BKT.product BM,
          bkt.buk_id buk_id
        FROM BALANCE TB,
          Reference_table REF,
          (SELECT DISTINCT start_date,
            end_date,
            product,buk_id
          FROM bucket BK
          WHERE id            = 879 
          ) BKT
        WHERE TB.BAL_DATE BETWEEN REF.EFF_FROM_DATE AND REF.EFF_TO_DATE
        AND TB.BAL_DATE BETWEEN BKT.start_date AND BKT.end_date
        AND BKT.product       = REF.product
        AND TB.ID = 1234
        GROUP BY TB.ID,
          TB.BAL_DATE,
          TB.BAL,
          TB.LIMIT_AMOUT,
          BKT.product,
          bkt.buk_id
          order by     TB.BAL_DATE;

ID_1	BAL_DATE	BAL	REFAM	T1VAL	T2VAL	T3VAL	T4VAL	T1PER	T2PER	T4PER	T1CHARGE	T2CHARGE	T3CHARGE	T4CHARGE	BM	BUK_ID
1234	01-JAN-08 00.00.00	195	-5000	200	5000			0	14.628	24.582					2300	1
1234	01-JAN-08 00.00.00	195	-5000	200	5000			0	14.628	24.582					2300	4
1234	02-JAN-08 00.00.00	6000	-5000	200	5000			0	14.628	24.582					2300	1
1234	02-JAN-08 00.00.00	6000	-5000	200	5000			0	14.628	24.582					2300	4
1234	03-JAN-08 00.00.00	210	-25	200	5000			0	14.628	24.582					2300	1
1234	03-JAN-08 00.00.00	210	-25	200	5000			0	14.628	24.582					2300	4
1234	04-JAN-08 00.00.00	55	-25	200	5000			0	14.628	24.582					2300	1
1234	04-JAN-08 00.00.00	55	-25	200	5000			0	14.628	24.582					2300	4
1234	14-OCT-09 00.00.00	195	-25	250	5000			0	14.013	0					2	2
1234	16-OCT-09 00.00.00	210	-25	250	5000			0	14.013	0					2	2
1234	16-JUN-14 00.00.00	2000	-5000	15	1000	2000	5000				0	0.75	1.5	3	2300	3
1234	19-JUN-14 00.00.00	5500	-25	15	1000	2000	5000				0	0.75	1.5	3	2300	3



Updated scripts

create table ref_final_table(id number,start_date date,end_date date,code number);

Insert into ref_final_table (ID,START_DATE,END_DATE,CODE) values (111,to_date('20-NOV-07 00.00.00','DD-MON-RR HH24.MI.SS'),to_date('08-OCT-08 00.00.00','DD-MON-RR HH24.MI.SS'),3333);
Insert into ref_final_table (ID,START_DATE,END_DATE,CODE) values (111,to_date('09-OCT-08 00.00.00','DD-MON-RR HH24.MI.SS'),to_date('08-OCT-09 00.00.00','DD-MON-RR HH24.MI.SS'),3334);

Re: To Split data based on dates [message #643956 is a reply to message #643914] Fri, 23 October 2015 10:52 Go to previous messageGo to next message
rohit_shinez
Messages: 139
Registered: January 2015
Senior Member
HI Barbara,

can you suggest on the updated query which i have posted , because as per your query there may be case there will be no codes which is configured in lookup table in ref_final_table so need to handle that as well

[Updated on: Fri, 23 October 2015 11:04]

Report message to a moderator

Re: To Split data based on dates [message #643963 is a reply to message #643956] Fri, 23 October 2015 21:09 Go to previous messageGo to next message
Barbara Boehmer
Messages: 9106
Registered: November 2002
Location: California, USA
Senior Member
Why don't you test it and see if it works for you or not. It looks like it should work or you could change the one that I posted to use an outer join. The one you have looks good. Just test it and see.
Re: To Split data based on dates [message #643969 is a reply to message #643614] Sat, 24 October 2015 07:09 Go to previous messageGo to next message
rohit_shinez
Messages: 139
Registered: January 2015
Senior Member
Yeah thats working but it replaces the value to 200 if any records exists because i need to replace the value of t1val to 200 for those which falls between the dates
Re: To Split data based on dates [message #643999 is a reply to message #643969] Sat, 24 October 2015 16:00 Go to previous messageGo to next message
Barbara Boehmer
Messages: 9106
Registered: November 2002
Location: California, USA
Senior Member
rohit_shinez wrote on Sat, 24 October 2015 05:09
Yeah thats working but it replaces the value to 200 if any records exists because i need to replace the value of t1val to 200 for those which falls between the dates


You say, "Yeah thats working but..." Which is working? What I provided or what you posted last?

Re: To Split data based on dates [message #644000 is a reply to message #643999] Sat, 24 October 2015 16:54 Go to previous messageGo to next message
rohit_shinez
Messages: 139
Registered: January 2015
Senior Member
What i have provided
Re: To Split data based on dates [message #644006 is a reply to message #644000] Sun, 25 October 2015 07:30 Go to previous messageGo to next message
Barbara Boehmer
Messages: 9106
Registered: November 2002
Location: California, USA
Senior Member
It looks to me like your code is doing what you want. You say that you want it to replace the t1val with 200 when the bal_date is between the start_date and end_date and it is doing that. It is also applying the additional condition involving the lookup_tab. Please see the demonstration below.

-- without the modification to t1val:
SCOTT@orcl12c> SELECT TB.ID ID_1,
  2  	       TB.BAL_DATE BAL_DATE,
  3  	       ROUND(ABS(TB.BAL)) BAL,
  4  	       DECODE(SIGN(TB.LIMIT_AMOUT), - 1,TB.LIMIT_AMOUT,NVL(TB.LIMIT_AMOUT,0)) REFAM,
  5  	       MAX(DECODE(TRIM(REF.TYPE),'T1',REF.MAX_AMT)) T1VAL,
  6  	       MAX(DECODE(TRIM(REF.TYPE),'T2',REF.MAX_AMT)) T2VAL,
  7  	       MAX(DECODE(TRIM(REF.TYPE),'T3',REF.MAX_AMT))T3VAL,
  8  	       MAX(DECODE(TRIM(REF.TYPE),'T4',REF.MAX_AMT))T4VAL,
  9  	       MAX(DECODE(TRIM(REF.TYPE),'T1',REF.RATE)) T1PER,
 10  	       MAX(DECODE(TRIM(REF.TYPE),'T2',REF.RATE)) T2PER,
 11  	       MAX(DECODE(TRIM(REF.TYPE),'T4',REF.RATE)) T4PER,
 12  	       MAX(DECODE(TRIM(REF.TYPE),'T1',REF.CHARGE)) T1CHARGE,
 13  	       MAX(DECODE(TRIM(REF.TYPE),'T2',REF.CHARGE)) T2CHARGE,
 14  	       MAX(DECODE(TRIM(REF.TYPE),'T3',REF.CHARGE)) T3CHARGE,
 15  	       MAX(DECODE(TRIM(REF.TYPE),'T4',REF.CHARGE)) T4CHARGE,
 16  	       BKT.product BM,
 17  	       bkt.buk_id buk_id
 18  	     FROM BALANCE TB,
 19  	       Reference_table REF,
 20  	       (SELECT DISTINCT start_date,
 21  		 end_date,
 22  		 product,buk_id
 23  	       FROM bucket BK
 24  	       WHERE id 	   = 879
 25  	       ) BKT
 26  	     WHERE TB.BAL_DATE BETWEEN REF.EFF_FROM_DATE AND REF.EFF_TO_DATE
 27  	     AND TB.BAL_DATE BETWEEN BKT.start_date AND BKT.end_date
 28  	     AND BKT.product	   = REF.product
 29  	     AND TB.ID = 1234
 30  	     GROUP BY TB.ID,
 31  	       TB.BAL_DATE,
 32  	       TB.BAL,
 33  	       TB.LIMIT_AMOUT,
 34  	       BKT.product,
 35  	       bkt.buk_id
 36  	       order by     TB.BAL_DATE;

      ID_1 BAL_DATE         BAL      REFAM      T1VAL      T2VAL      T3VAL      T4VAL      T1PER      T2PER      T4PER   T1CHARGE   T2CHARGE   T3CHARGE   T4CHARGE BM                       BUK_ID
---------- --------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- -------------------- ----------
      1234 01-JAN-08        195      -5000          0       5000                                0     14.628     24.582                                             2300                          1
      1234 01-JAN-08        195      -5000          0       5000                                0     14.628     24.582                                             2300                          4
      1234 02-JAN-08       6000      -5000          0       5000                                0     14.628     24.582                                             2300                          1
      1234 02-JAN-08       6000      -5000          0       5000                                0     14.628     24.582                                             2300                          4
      1234 03-JAN-08        210        -25          0       5000                                0     14.628     24.582                                             2300                          1
      1234 03-JAN-08        210        -25          0       5000                                0     14.628     24.582                                             2300                          4
      1234 04-JAN-08         55        -25          0       5000                                0     14.628     24.582                                             2300                          1
      1234 04-JAN-08         55        -25          0       5000                                0     14.628     24.582                                             2300                          4
      1234 14-OCT-09        195        -25        250       5000                                0     14.013          0                                             2                             2
      1234 16-OCT-09        210        -25        250       5000                                0     14.013          0                                             2                             2

10 rows selected.


-- with the modification to t1val:
SCOTT@orcl12c> SELECT TB.ID ID_1,
  2  	       TB.BAL_DATE BAL_DATE,
  3  	       ROUND(ABS(TB.BAL)) BAL,
  4  	       DECODE(SIGN(TB.LIMIT_AMOUT), - 1,TB.LIMIT_AMOUT,NVL(TB.LIMIT_AMOUT,0)) REFAM,
  5  	       case when exists (select 1 from ref_final_table rft where tb.bal_date between rft.start_date and rft.end_date
  6  	       and rft.code in (select id from lookup_tab )) then 200 else MAX(DECODE(TRIM(REF.TYPE),'T1',REF.MAX_AMT)) end T1VAL,
  7  	       MAX(DECODE(TRIM(REF.TYPE),'T2',REF.MAX_AMT)) T2VAL,
  8  	       MAX(DECODE(TRIM(REF.TYPE),'T3',REF.MAX_AMT))T3VAL,
  9  	       MAX(DECODE(TRIM(REF.TYPE),'T4',REF.MAX_AMT))T4VAL,
 10  	       MAX(DECODE(TRIM(REF.TYPE),'T1',REF.RATE)) T1PER,
 11  	       MAX(DECODE(TRIM(REF.TYPE),'T2',REF.RATE)) T2PER,
 12  	       MAX(DECODE(TRIM(REF.TYPE),'T4',REF.RATE)) T4PER,
 13  	       MAX(DECODE(TRIM(REF.TYPE),'T1',REF.CHARGE)) T1CHARGE,
 14  	       MAX(DECODE(TRIM(REF.TYPE),'T2',REF.CHARGE)) T2CHARGE,
 15  	       MAX(DECODE(TRIM(REF.TYPE),'T3',REF.CHARGE)) T3CHARGE,
 16  	       MAX(DECODE(TRIM(REF.TYPE),'T4',REF.CHARGE)) T4CHARGE,
 17  	       BKT.product BM,
 18  	       bkt.buk_id buk_id
 19  	     FROM BALANCE TB,
 20  	       Reference_table REF,
 21  	       (SELECT DISTINCT start_date,
 22  		 end_date,
 23  		 product,buk_id
 24  	       FROM bucket BK
 25  	       WHERE id 	   = 879
 26  	       ) BKT
 27  	     WHERE TB.BAL_DATE BETWEEN REF.EFF_FROM_DATE AND REF.EFF_TO_DATE
 28  	     AND TB.BAL_DATE BETWEEN BKT.start_date AND BKT.end_date
 29  	     AND BKT.product	   = REF.product
 30  	     AND TB.ID = 1234
 31  	     GROUP BY TB.ID,
 32  	       TB.BAL_DATE,
 33  	       TB.BAL,
 34  	       TB.LIMIT_AMOUT,
 35  	       BKT.product,
 36  	       bkt.buk_id
 37  	       order by     TB.BAL_DATE;

      ID_1 BAL_DATE         BAL      REFAM      T1VAL      T2VAL      T3VAL      T4VAL      T1PER      T2PER      T4PER   T1CHARGE   T2CHARGE   T3CHARGE   T4CHARGE BM                       BUK_ID
---------- --------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- -------------------- ----------
      1234 01-JAN-08        195      -5000        200       5000                                0     14.628     24.582                                             2300                          1
      1234 01-JAN-08        195      -5000        200       5000                                0     14.628     24.582                                             2300                          4
      1234 02-JAN-08       6000      -5000        200       5000                                0     14.628     24.582                                             2300                          1
      1234 02-JAN-08       6000      -5000        200       5000                                0     14.628     24.582                                             2300                          4
      1234 03-JAN-08        210        -25        200       5000                                0     14.628     24.582                                             2300                          1
      1234 03-JAN-08        210        -25        200       5000                                0     14.628     24.582                                             2300                          4
      1234 04-JAN-08         55        -25        200       5000                                0     14.628     24.582                                             2300                          1
      1234 04-JAN-08         55        -25        200       5000                                0     14.628     24.582                                             2300                          4
      1234 14-OCT-09        195        -25        250       5000                                0     14.013          0                                             2                             2
      1234 16-OCT-09        210        -25        250       5000                                0     14.013          0                                             2                             2

10 rows selected.


-- values from other tables to show that all t1val that were changed to 200 above were between the dates and such:
SCOTT@orcl12c> SELECT * FROM ref_final_table
  2  /

        ID       CODE START_DAT END_DATE     PRODUCT     BUK_ID
---------- ---------- --------- --------- ---------- ----------
       879       3333 20-NOV-07 08-OCT-08       2300          4
       879       3334 09-OCT-08 08-OCT-09       2300          4

2 rows selected.

SCOTT@orcl12c> SELECT * FROM lookup_tab
  2  /

        ID
----------
      3333
      3334

2 rows selected.


Re: To Split data based on dates [message #644010 is a reply to message #644006] Sun, 25 October 2015 13:44 Go to previous messageGo to next message
rohit_shinez
Messages: 139
Registered: January 2015
Senior Member
yes barbara i am able to get the results based on my updated query one more thing in main query there is change in logic for derivation when the bal_date is greater than 2014-06-15 i need to apply below logic

i.e to check the balance which falls in range from reference_table and then put the value in respective T1,T2,T3,T4

output
ID_1	BAL_DATE	T1	T2	T3	T4
1234	16-JUN-14 00.00.00	0	0	2000	0
1234	19-JUN-14 00.00.00	0	0	0	0
					
balance					
ID	BAL_DATE	BAL			
1234	16-JUN-14 00.00.00	-2000			
1234	19-JUN-14 00.00.00	-5500			

reference_table
					
TYPE	MIN_AMT	MAX_AMT			
T1	0	15			
T2	16	1000			
T3	1001	2000			
T4	2001	5000			


[Updated on: Sun, 25 October 2015 15:00]

Report message to a moderator

Re: To Split data based on dates [message #644011 is a reply to message #644010] Sun, 25 October 2015 18:19 Go to previous message
Barbara Boehmer
Messages: 9106
Registered: November 2002
Location: California, USA
Senior Member
Your problem is unclear as usual. If there are any changes in your test data, then you need to post that. You need to also post what query or sub-query you have tried to apply the additional condition, what results you have gotten, and what results you want. You need to very clear as to which is which. Providing only one and labeling it as output does not say if that is what you are getting or what you want. Please bear in mind that we are not here to do your work for you. You need to try something yourself first before just posting an additional requirement. As suggested by others elsewhere, if you are having this much trouble with your whole problem, you probably need to hire a consultant. You have exceeded what can be expected from forums.
Previous Topic: Compare values based on range
Next Topic: remote database migration
Goto Forum:
  


Current Time: Sun Jul 19 00:45:10 CDT 2026