通过VLOOKUP清理SQL Query中的数据

时间:2018-04-10 14:07:59

标签: mysql sql vlookup lookup

我有一个查询,可以在以下列中提取销售数据:

  • 购买日期
  • 产品ID
  • 产品名称
  • 价格

但是,在业务的早期阶段,某些产品ID的输入格式错误。 目前,我有一个Excel文件,其中A列中的旧/错ID和B列中的正确ID。

我想知道是否有办法编写查询产品ID是否在列表的A列中的查询。如果为True,它将从B列返回正确的ID,如果为False,它将从数据库返回产品ID。

在Excel中我会按以下方式执行:= IFERROR(VLOOKUP(产品ID,ID修订表A:B,2,FALSE),产品ID)

样本数据

#   Created On        Item IDs  Product Name   Price
1   26/02/2018 10:51    ABC1    Product Name 1  99
2   26/02/2018 10:22    G7781   Product Name 2  1299
3   26/02/2018 10:23    L5303   Product Name 3  165
4   26/02/2018 10:24    G9576   Product Name 4  1999
5   26/02/2018 10:26    ABC2    Product Name 5  99
6   26/02/2018 10:30    GGG1    Product Name 6  469
7   26/02/2018 10:37    T1283   Product Name 7  299
8   26/02/2018 10:42    L4505   Product Name 8  329
9   26/02/2018 10:48    L3007   Product Name 9  99

正如您所看到的,我们使用L,G或T后跟我们产品的数字。 我们三个垂直中的每一个都有一个字母。 但是,有些人在早期就添加了ABC或GGG前缀。

Column A   Column B
    ABC1    L886
    ABC2    L5632
    GGG1    G7268

这就是为什么我在A列中使用旧/不正确ID的额外文件,以及B列中的正确ID。

我想要的结果是按垂直分组销售数据(以L,T或G开头的ID)。但在此之前,我需要做一些Lookup来修复错误的Item ID。

1 个答案:

答案 0 :(得分:1)

如果db中的值正确

drop table if exists t,t1;

create table t( id int, itemid varchar(20));

insert into t values
(1 ,     'ABC1' ),   
(2 ,     'G7781'),  
(3 ,     'L5303'),  
(4 ,     'G9576'),  
(5 ,     'ABC2' ),  
(6 ,     'GGG1' ),  
(7 ,     'T1283'),   
(8 ,     'L4505'),   
(9 ,     'L3007');

create table t1(Columna varchar(20),Columnb varchar(20));
insert into t1 values
(    'ABC1'   , 'L886'),
(    'ABC2'   , 'L5632'),
(    'GGG1'   , 'G7268');

select left(
         case when t1.columnb is not null then t1.columnb
         else t.itemid
         end ,1)  vertical,
         count(*) obs
from t
left join t1 on t1.columna = t.itemid
group by left(case when t1.columnb is not null then t1.columnb
         else t.itemid
         end ,1);

+----------+-----+
| vertical | obs |
+----------+-----+
| G        |   3 |
| L        |   5 |
| T        |   1 |
+----------+-----+
3 rows in set (0.00 sec)