暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle SQL版本的索引和Excel中的匹配

ASKTOM 2019-01-14
371

问题描述

大家好,

我有一个挑战,使用ORACLE SQL来模仿Excel做什么匹配基于标题和内容的2个表。详情如下。

表1
cid名称年龄高度
001玛丽E40 E22
002类E22 E40

表2
数据代码含义
年龄E40 40岁
年龄E22 22岁
高度E22 5'2
高度E40 5'4

目标:
To replace codes in 表1 with corresponding meaning

预期结果:
cid名称年龄高度
001玛丽40岁5'2
002猫22岁5'4

当前的做法-EXCEL:
1. Add a calculated field in 表2 combining Data and Code fields
现场代码混合
年龄E40 40岁 AgeE40
年龄E22 22岁 AgeE22
高度E22 5'2 HeightE22
高度E40 5'4 HeightE40

2. Use match and index to replace code from 表1 with meaning from 表2
1 A B C D E F
2 cid CName年龄高度行 # 列下合并行 # 列合并下
3 001玛丽E40 E22匹配 (C $1 & C2,$ D $7:$ D $10,0) 匹配 (D $1 & D2,$ D $7:$ D $10,0)
4 002类E22 E40匹配 (C $1 & C3,$ D $7:$ D $10,0) 匹配 (D $1 & D3,$ D $7:$ D $10,0)

1克小时
2用意义代替年龄用意义代替身高
3指数 ($ C $7:$ C $10,H2,1) 指数 ($ C $7:$ C $10,I2,1)
4指数 ($ C $7:$ C $10,H3,1) 指数 ($ C $7:$ C $10,I3,1)

$C$7:$C$10 is the range of data for Meaning from 表2

非常感谢您的帮助!

谢谢!!

玛丽

专家解答

这里有一种方法来解决这个问题:

加入两个表,其中:

-年龄列 = T2和T2字段类型中的代码为年龄
或者
-高度列 = T2和T2字段类型中的代码为高度

例如:

select *
from   table_1 t1
join   table_2 t2
on     ( t1.age = t2.code and t2.dfield = 'Age' ) or 
       ( t1.height = t2.code and t2.dfield = 'Height' );

CID   CNAME   AGE   HEIGHT   DFIELD   CODE   MEANING        
001   Mary    E40   E22      Height   E22    5"2            
001   Mary    E40   E22      Age      E40    40 years old   
002   Cat     E22   E40      Height   E40    5"4            
002   Cat     E22   E40      Age      E22    22 years old   


这为您提供了已加入t2的t1中的行/列。要将这些折叠成一个,请调整结果:

with rws as ( 
  select cid, cname, dfield, meaning
  from   table_1 t1
  join   table_2 t2
  on     ( t1.age = t2.code and t2.dfield = 'Age' ) or 
         ( t1.height = t2.code and t2.dfield = 'Height' ) 
) 
  select * from rws
  pivot ( 
    max ( meaning ) for 
    dfield in ( 
      'Age' age, 'Height' height 
    ) 
  )
  order  by 1;

CID   CNAME   AGE            HEIGHT   
001   Mary    40 years old   5"2      
002   Cat     22 years old   5"4    


下面是create table inserts:

create table table_1 (
  cid varchar(25), 
  cname varchar(25), 
  age varchar(25), 
  height varchar(25) 
);

create table table_2 (
  dfield varchar(25), 
  code varchar(25), 
  meaning varchar(25) 
);

insert into table_1 values ('001', 'Mary', 'E40', 'E22');
insert into table_1 values ('002', 'Cat', 'E22', 'E40') ;

insert into table_2 values ('Height', 'E22', '5"2');
insert into table_2 values ('Height', 'E40', '5"4') ;

insert into table_2 values ('Age','E40','40 years old') ;
insert into table_2 values ('Age', 'E22', '22 years old') ;

文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论