/*
需求名称*: 2011年6月VIP制卡数据卡号提供 是否敏感数据*: 否
工单编号*: ZJ201107010003
申请人名称*: 申请人联系手机*:
申请人部门*: 服务管理室 工单及时性*: 急(2天)
代理人: 代理人手机:
所属公司*: 市公司 需求类别*: 帐务类
赠送发起人:
是否要申请成固定单*: 否
固定单提数周期*: 不固定周期
周期内执行时间*: 周期内第 天发起提数单。
固定单结束时间*:
申请原因*: 每月例行制卡
数据提取详细描述:
数据提取字段详细描述*: 分配卡号|原卡号|
数据提取要求时限*: 2011-07-04 是否临时性数据*: 是
*/
/*
----导入存量数据
create table tb_lzw_vipser_before_110704
(
seq_code number ,
servnumber varchar2(11) ,
pd_type varchar2(64) ,
card_type varchar2(64) ,
card_no varchar2(64)
)
;
select count(servnumber),count(distinct servnumber) from tb_lzw_vipser_before_110704;
6237262369
----创建序列SEQ_NO
create sequence SEQ_NO
minvalue 1
maxvalue 999999
start with 1
increment by 1
cache 20
order;
----生成新的原始明细表
create table tb_lzw_zj20110704_vipser nologging as
select
seq_no.nextval seq_code ,
b.*
from (select
a.servnumber ,
a.pd_type ,
a.card_type
from tb_lzw_vipser_before_110704 a
order by a.seq_code
) b
;
select count(1) from tb_lzw_zj20110704_vipser;
62372
select count(1) from tb_lzw_vipser_before_110704;
62372
*/
----导入excel数据
create table tmp_lzw_vipser_indata (
servnumber varchar2(20) ,
old_card_type varchar2(64) ,
new_card_type varchar2(64) ,
make_card varchar2(128) ,
name varchar2(64) ,
pinyin varchar2(64) ,
enddate varchar2(64) ,
company varchar2(64) ,
custmgr varchar2(64) ,
addr varchar2(128)
)
;
/*
--temp.ctl
load data
infile 'ZJ201107010003_data.txt'
truncate
into table tmp_lzw_vipser_indata
fields terminated by '|'
trailing nullcols
(
servnumber ,
old_card_type ,
new_card_type ,
make_card ,
name ,
pinyin ,
enddate ,
company ,
custmgr ,
addr
)
*/
sqlldr 用户名密码 control=temp.ctl
/*
select count(servnumber),count(distinct servnumber) from tmp_lzw_vipser_indata;
2727
*/
/*
----查找是否已经在原表tb_lzw_vipser_before_110704中分配过
select
a.servnumber ,
a.pd_type ,
a.card_type
from tb_lzw_vipser_before_110704 a,
tmp_lzw_vipser_indata b
where a.servnumber = b.servnumber
order by a.servnumber
;
*/
----插入 (5个评定标准或卡类型不一致的号码 + 7个新号码) 到新原始明细表中 (12个号)
insert into tb_lzw_zj20110704_vipser values (seq_no.nextval , '11111111111', '特殊评定' , '金卡' );
commit ;
/*
select count(1) from tb_lzw_zj20110704_vipser;
62384
select servnumber,count(servnumber)
from tb_lzw_zj20110704_vipser
group by servnumber
having count(servnumber) >= 2
;
*/
----根据评定类型、VIP类型确定卡号前10位及对应序号
create table tb_lzw_zj20110704_vipser2 nologging as
select a.seq_code , --序号
a.servnumber , --号码
a.pd_type , --评定类型(ITC)
a.card_type , --2011卡类
a.style||a.style2 code , --卡号前10位
row_number () over (partition by a.style||a.style2 order by a.seq_code) code1 --序列号
from (select
x.seq_code ,
x.servnumber ,
x.pd_type ,
x.card_type ,
case when x.card_type = '钻石卡' then 191101112
when x.card_type = '金卡' then 191101212
when x.card_type = '银卡' then 191101312 end style ,
case when x.pd_type = '积分评定' then 1
when x.pd_type = '积分评定(优质客户)' then 1
when x.pd_type = '老客户升级' then 5
when x.pd_type = '老客户升级(优质客户)' then 5
when x.pd_type = '内部测试客户' then 4
when x.pd_type = '普通老客户' then 5
when x.pd_type = '套餐评定' then 6
when x.pd_type = '特殊评定' then 2
when x.pd_type = '特殊评定(优质客户)' then 2 end style2
from tb_lzw_zj20110704_vipser x
) a
;
----中间汇总数据
create table tb_lzw_zj20110704_vipser3
(
seq_code number(5) , /*序号*/
servnumber varchar2(20) , /*号码*/
pd_type varchar2(64) , /*评定类型(ITC)*/
card_type varchar2(64) , /*2011卡类*/
code number(10) , /*卡号前10位*/
code2 number(5) /*客户编号序列号*/
)
;
----银卡号码处理(2、银卡的X9(最后一位)避免用4、7)
declare
v_seq_code number(5) ;
v_servnumber varchar2(20) ;
v_pd_type varchar2(64) ;
v_card_type varchar2(64) ;
v_code varchar2(20) ;
v_code1 number(5) ;
v_code2 number(5):=0 ;
cursor v_cursor is
select a.seq_code ,
a.servnumber ,
a.pd_type ,
a.card_type ,
a.code ,
a.code1
from tb_lzw_zj20110704_vipser2 a
where a.card_type = '银卡'
;
begin
open v_cursor;
loop
fetch v_cursor into v_seq_code,v_servnumber,v_pd_type,v_card_type,v_code,v_code1;
exit when v_cursor%notfound;
v_code2:=v_code2+1;
if v_code1=1 then
v_code2:=1;
elsif mod(v_code2,10)=4 or mod(v_code2,10)=7 then
v_code2:=v_code2+1;
end if;
insert into tb_lzw_zj20110704_vipser3 values
(v_seq_code,v_servnumber,v_pd_type,v_card_type,v_code,v_code2);
commit ;
end loop ;
close v_cursor ;
end
;
----钻石卡、金卡号码处理(1、全球通钻石卡、金卡的X9(最后一位) 要求为8)
insert into tb_lzw_zj20110704_vipser3 nologging
select
s.seq_code ,
s.servnumber ,
s.pd_type ,
s.card_type ,
s.code ,
(s.code1-1)*10+8
from tb_lzw_zj20110704_vipser2 s
where s.card_type in ('钻石卡','金卡')
;
commit ;
/*
select distinct
card_type ,
mod(code2,10)
from tb_lzw_zj20110704_vipser3
order by card_type , mod(code2,10)
;
金卡8
银卡0
银卡1
银卡2
银卡3
银卡5
银卡6
银卡8
银卡9
钻石卡8
select
count(code||code2) ,
count(distinct code||code2)
from tb_lzw_zj20110704_vipser3
;
6238462384
*/
----生成全部号码的结果
create table tb_lzw_zj20110704_vipser4 nologging as
select
a.seq_code ,
a.servnumber ,
a.pd_type ,
a.card_type ,
case when length(a.code2) = 1 then a.code||'00000'||a.code2
when length(a.code2) = 2 then a.code||'0000'||a.code2
when length(a.code2) = 3 then a.code||'000'||a.code2
when length(a.code2) = 4 then a.code||'00'||a.code2
when length(a.code2) = 5 then a.code||'0'||a.code2
when length(a.code2) = 6 then a.code||a.code2 end card_no
from tb_lzw_zj20110704_vipser3 a
order by a.seq_code
;
/*
select count(card_no) , count(distinct card_no)
from tb_lzw_zj20110704_vipser4
;
6238462384
select count(*)
from tb_lzw_vipser_before_110704 a,
tb_lzw_zj20110704_vipser4 b
where a.servnumber = b.servnumber
and a.card_no = b.card_no
;
62372
*/
----提取新VIP号
create table tmp_lzw_vipser_new as
select
a.seq_code ,
a.servnumber ,
a.pd_type ,
a.card_type ,
a.card_no
from (
select
x.seq_code ,
x.servnumber ,
x.pd_type ,
x.card_type ,
x.card_no ,
row_number () over (partition by x.servnumber order by x.seq_code desc) code1
from tb_lzw_zj20110704_vipser4 x,
tmp_lzw_vipser_indata y
where x.servnumber = y.servnumber
) a
where a.code1 = '1'
;
/*
select count(servnumber),count(distinct servnumber) from tmp_lzw_vipser_new;
2727
*/
----结果
--分配卡号|原卡号|客户号码|原卡类|拟制卡类|制卡原因|使用人中文名|实际使用者拼音|有效期限|服务分公司|客户经理|邮寄地址|
create table tmp_lzw_vipser_result nologging as
select
b.card_no ncard_no,
c.card_no ocard_no,
a.servnumber ,
a.old_card_type ,
a.new_card_type ,
a.make_card ,
a.name ,
a.pinyin ,
a.enddate ,
a.company ,
a.custmgr ,
a.addr
from tmp_lzw_vipser_indata a,
tmp_lzw_vipser_new b,
tb_lzw_vipser_before_110704 c
where a.servnumber = b.servnumber(+)
and a.servnumber = c.servnumber(+)
;
/*
select count(servnumber),count(distinct servnumber) from tmp_lzw_vipser_result;
2727
*/
----导出结果
--分配卡号|原卡号|客户号码|原卡类|拟制卡类|制卡原因|使用人中文名|实际使用者拼音|有效期限|服务分公司|客户经理|邮寄地址|
set newpage none heading off space 0 pagesize 0 trimout on trimspool on linesize 2500 colsep | feedback off termout off pages 0
alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
spool lzw_ZJ201107010003_result.txt
select
a.ncard_no ||'|'||
a.ocard_no ||'|'||
a.servnumber ||'|'||
a.old_card_type ||'|'||
a.new_card_type ||'|'||
a.make_card ||'|'||
a.name ||'|'||
a.pinyin ||'|'||
a.enddate ||'|'||
a.company ||'|'||
a.custmgr ||'|'||
a.addr ||'|'
from tmp_lzw_vipser_result a
order by a.servnumber
;
spool off;
drop table tb_lzw_vipser_before_110704 purge;
drop table tb_lzw_zj20110704_vipser purge;
drop table tmp_lzw_vipser_indata purge;
drop table tb_lzw_zj20110704_vipser2 purge;
drop table tb_lzw_zj20110704_vipser3 purge;
drop table tb_lzw_zj20110704_vipser4 purge;
drop table tmp_lzw_vipser_new purge;
drop table tmp_lzw_vipser_result purge;
drop sequence SEQ_NO;