【记一次数据处理】在oracle中如何将标注了户主姓名和户主关系的数据关联户主身份证号

文章介绍了如何在Excel中处理数据,尤其是当数据涉及户主关系且存在重名时,如何提取户主的身份证号。对于规范的数据,可以直接使用Excel公式;如果不规范,则通过SQL在数据库层面进行数据排序和处理。提供了Oracle和MySQL的示例代码来解决不规则数据的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

日常工作中,会处理很多数据,有时候会遇到这么一个情况,excel中收集的数据,标注了姓名,身份证号,户主姓名,与户主关系。因为可能存在户主姓名重名的情况,所以需要关联出户主身份证号。当我们找到数据提供人告诉他这个不知道怎么提取的时候,他会告诉你 “这同一户的数据是挨着的啊,你提取一下就行了。”
这种情况,一定让你十分的头痛,今天,我介绍几种我平时遇到的几种情况,以及我的处理方法。

数据相对规范

如果,表格内的数据相对规范,比如,同一户的数据挨在一起,并且户主的数据在一户里的第一个

姓名身份证号户主姓名与户主关系
AAxxxxxxxxxxxxxxxxxxAA户主
BBxxxxxxxxxxxxxxxxxxAA长子

这种格式的数据,直接在excel里边使用公式就能处理

ABCDE
姓名身份证号户主姓名与户主关系户主身份证号
AAxxxxxxxxxxxxxxxxxxAA户主=if(D2=“户主”,B2,E1)
BBxxxxxxxxxxxxxxxxxxAA长子

将上面的公式根据自己情况修改一下,然后填充这一列,就能完成户主证件号的提取了

数据不太规范

有时候,数据并不是特别的规范,例如,虽然同一户的数据是挨在一起的,但是户主并不是第一个,可能是最后一个,或者在中间,遇到这种情况,我都是在数据库里处理的,excel可能可以处理,但是我并不擅长使用excel

姓名身份证号户主姓名与户主关系
AAxxxxxxxxxxxxxxxxxxCC长子
BBxxxxxxxxxxxxxxxxxxCC次子
CCxxxxxxxxxxxxxxxxxxCC户主
DDxxxxxxxxxxxxxxxxxxCC配偶

处理这种数据,首先,是要将数据规范化,将户主的数据排在前面,这时候,需要加入一个序号列,记录数据原来在excel中的位置

首先,我们将数据规范化

select * from tab order by 户主姓名,(case when 与户主关系 = '户主' then 0 else 1 end),序号

以上代码的写法,oracle和mysql都可以使用
mysql可以用if函数来简化case when
oracle可以用decode函数来简化

数据规范化之后,可以选择将规范后的数据放入excel中使用上面提到的方法处理,也可以在数据库中继续处理

mysql中处理起来相对容易

select t1.*,if(t1.与户主关系='户主',@id_card:=身份证号,@id_card) 户主证件号 from
(select * from tab order by 户主姓名,(case when 与户主关系 = '户主' then 0 else 1 end),序号) t1,(select @id_card:='') pm

oracle中处理起来,比mysql要复杂一点,因为在oracle中,并不能在查询语句中定义变量,需要写脚本才行

declare
ID_CARD varchar2(20);
begin
--写一个循环,遍历排序好的结果
for r in (select * from tab order by 户主姓名,(case when 与户主关系 = '户主' then 0 else 1 end),序号) loop
	if(r.与户主关系='户主') then
		ID_CARD:=r.身份证号;
	end if;
	update tab set 户主身份证号  = ID_CARD where 序号 = r.序号;
end loop;
commit;  --循环结束后再提交,有助于提升效率,如果数据量太大的话,提升效率需要在循环内判断更新了多少次,分批次提交
end;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值