怎么根据B表字典,替换A表多列单元格中的内容?

怎么根据B表字典,替换A表多列单元格中的内容,达到C表的效果?实现方式:excel函数,oracle的sql语句

img

img

img


输入后不要乱点,按enter键确定
=VLOOKUP(A3,H2:I11,2,TRUE)

img

img

复制 =VLOOKUP(A3,H2:I11,2,TRUE) 把A3改成B3,复制到B17单元格

img

img

重复以上步骤,即可完成,你要注意使用enter键和esc建。enter是确认值的,esc键可以脱离当前单元格编辑

img

列数不确定,列名不确定,这个问题有意思,直接上sql

---测试数据
create table test_a_20220225
(col1_fasfa varchar2(10),col2_eufyei varchar2(10),col3_bdgooer varchar2(10));
insert into test_a_20220225 values('a','b','e');
insert into test_a_20220225 values('c','v','n');
insert into test_a_20220225 values('x','r','t');
commit;

create table test_b_20220225
(from_str varchar(10),to_str varchar(10));
insert into test_b_20220225 values ('a','1');
insert into test_b_20220225 values ('b','2');
insert into test_b_20220225 values ('c','3');
insert into test_b_20220225 values ('e','4');
insert into test_b_20220225 values ('n','5');
insert into test_b_20220225 values ('t','6');
insert into test_b_20220225 values ('v','7');
insert into test_b_20220225 values ('r','8');
insert into test_b_20220225 values ('x','9');
commit;

--创建c表
create table test_c_20220225 as select * from test_a_20220225 where 1=2;

--生成C表数据
declare
  l_sql clob;
begin
  l_sql := empty_clob();
  dbms_lob.createtemporary(l_sql, true);
  l_sql := 'insert into test_c_20220225 select '; --这里放目标表名
  for rec in (SELECT t2.column_value.getrootelement() name
                FROM (SELECT *
                        FROM TABLE(XMLSEQUENCE(cursor (select *
                                                  from test_a_20220225  --这里放原表名
                                                 where rownum = 1)))) t1,
                     TABLE(XMLSEQUENCE(EXTRACT(t1.column_value,
                                               '/ROW/node()'))) t2) loop
    dbms_lob.append(l_sql,
                    'replace(' || rec.name || ',' || rec.name || ',' ||
                    '(select to_str from test_b_20220225 where from_str=' || ---这里放用于匹配的表名
                    rec.name || ')),');
  
  end loop;
  dbms_lob.write(lob_loc => l_sql,
                 amount  => 1,
                 offset  => dbms_lob.getlength(l_sql),
                 buffer  => ' ');
  dbms_lob.append(l_sql, ' from test_a_20220225 '); ---这里放原表名
  execute immediate l_sql;
  commit;
end;

--查看c表数据
select * from test_c_20220225;

img

无论你有多少列,哪怕有几百个列,而且列名没有任何规则,用这个sql都可以把你数据给转换了,不需要在excel表里对每一个列都单独写公式,因为这个sql里面没有指定任何列名,全是动态获取


虽然不优雅,但是好用,数据量不大可以用以下方式,如果数据量大改用存储过程方式for循环逐一处理,但是也是慢。

select
(select distinct 统称 from B dm where dm.简称=t.第一列名 ) 第1列,
(select distinct 统称 from B dm where dm.简称=t.第二列名 ) 第2列,
(select distinct 统称 from B dm where dm.简称=t.第三列名 ) 第3列
from A t


vlookup 一拉就行了,

img

存三个矩阵,遍历a矩阵,在b中找到对应的值,写到C中。

使用sql语句的自然连接即可完成表的连接

vlookup匹配既可以达到效果。