#原创文章,转载请注明出处
银行贷款核算的时候有拆分数据的需求,记录遇到的情况如下:
一拆多:
举例来说,贷款核算表Test1里面一条记录有四个个金额,PRI_AMT,INT_AMT,ODP_AMT,ODI_AMT.
新增一个字段,如果是ODP_AMT>0显示'ODP',如果是ODI_AMT>0显示'ODI'.如果两个都大于0,显示两条数据'ODI'和'ODP'
思路1:
把两种情况分别算出来,表合并
create table TEST1
(
PRI_AMT smallint,
INT_AMT smallint,
ODI_AMT smallint,
ODP_AMT smallint
);
--插入测试数据
--二值化
--模拟正常数据范围内所有情况
insert into TEST1 values(0,1,0,0);
insert into TEST1 values(0,1,0,1);
insert into TEST1 values(0,1,1,0);
insert into TEST1 values(0,1,1,1);
insert into TEST1 values(1,1,0,0);
insert into TEST1 values(1,1,0,1);
insert into TEST1 values(1,1,1,0);
insert into TEST1 values(1,1,1,1);
commit;
--合并表格
select ODI_AMT,ODP_AMT,case when ODI_AMT!=0 then 'ODI' else null end
from TEST1 T1 where ODI_AMT>0
union all
select ODI_AMT,ODP_AMT,case when ODP_AMT<>0 then 'ODP' else null end
from TEST1 T1 where ODP_AMT>0
思路2:
表连接做笛卡尔积的时候有选择连接数据
有条件一拆多():
--合并表格
select ODI_AMT,ODP_AMT,C
from TEST1 T1
join
(select 'ODP' C from dual
union all
select 'ODI' C from dual)T2 on case when T2.C='ODP' then ODP_AMT else ODI_AMT end >0
又比如
当PRI_AMT=0的时候,新增字段为'INT',不等于零的时候拆分为两条数据,'PRI'和'ODI'.有条件引用笛卡尔积的数据.
select distinct PRI_AMT,INT_AMT,case when PRI_AMT=0 then 'INT' else T2.c end
from TEST1 T1 left join
(select 'PRI' C from dual
union all
select 'ODI' C from dual)T2 on PRI_AMT>0;
合并表格:(相同的表连接,字段不同的取值条件)
有时候会遇到同样的表连接,不同的连接条件,可以使用表拼接,也可以在表连接的时候使用复杂条件筛选数据.比如不同贷款状态的字段计算
比如有贷款主题表Table1,需要加上没有的字段: 贷款状态C('NORM','OVER','CHRGO'),连接表Table2,每个状态对应table2字段field筛选条件为C1,C2,C3
select * from table1
join
(select 'NORM' c from dual
union all
select 'OVER' c from dual
union all
select 'CHRGO' c from dual
) t2
on 1=1
JOIN table3 on table3.field=decode(t2.c,'NORM',C1,'OVER',C2,'CHRGO',C3)