SQL拆分数据

本文介绍了在银行贷款核算中处理一拆多数据需求的两种SQL策略:一是通过合并表格并应用CASEWHEN语句,二是利用表连接和笛卡尔积进行条件拆分。作者给出了详细的SQL代码示例,包括不同情况下的字段选择和连接条件的灵活运用。
摘要由CSDN通过智能技术生成

#原创文章,转载请注明出处

银行贷款核算的时候有拆分数据的需求,记录遇到的情况如下:

一拆多:

举例来说,贷款核算表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)

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值