Как заменить значения в нескольких столбцах, используя таблицу поиска, которая содержит все сопоставления? - PullRequest
1 голос
/ 03 апреля 2019

У меня есть таблица, которая содержит 4 столбца кодов продуктов (плюс другие столбцы). У меня есть другая таблица, которая содержит столбец all_codes и другой столбец с descriptions кодов.

Как объединить (или заменить) несколько столбцов кодов в первой таблице с описаниями во второй таблице?

Мне удалось использовать функцию замены, чтобы получить описание для одного из моих столбцов, присоединившись к tbl1.code1 = tbl2.all_codes, но не могу заставить его работать до

tbl1.code2 = tbl2.all_codes, tbl1.code3 = tbl2.all_codes и т. Д. И т. Д.

Таблица 1

    OrderNo  |  Style_code |   Color_code |   Country_code
-------------|-------------|--------------|---------------
     21540   |    abc      |     kdx      |      plo
     21541   |    gcs      |     kdy      |      pla
     21542   |    wer      |     kdz      |      plh
     21543   |    abc      |     kdx      |      pld
     21544   |    gcs      |     kdy      |      plo

Таблица 2

 all_codes   |  description
 ------------|-----------------  
    abc      |     plain
    gcs      |     vintage
    wer      |     modern
    kdx      |     white
    kdy      |     gray
    kdz      |     black
    plo      |     USA
    pla      |     Mexico
    plh      |     Canada
    pld      |     Brazil

Желаемый вывод

    OrderNo  |  Style_desc |   Color_desc |   Country_desc
-------------|-------------|--------------|---------------
     21540   |  plain      |  white       |      USA
     21541   |  vintage    |  gray        |      Mexico
     21542   |  modern     |  black       |      Canada
     21543   |  plain      |  white       |      Brazil
     21544   |  vintage    |  gray        |      USA

Может кто-нибудь помочь мне придумать лучший способ сделать это?

Ответы [ 2 ]

0 голосов
/ 03 апреля 2019

Может кто-нибудь помочь мне придумать лучший способ сделать это?

Опция ниже для стандартного SQL BigQuery. Если не лучший - безусловно, хороший, чтобы попробовать. Предполагается, что таблица all_codes невелика, поэтому массив этих кодов является управляемым ...

#standardSQL
CREATE TEMP FUNCTION code_mapping(code STRING, all_codes ARRAY<STRUCT<all_codes STRING, description STRING>>) AS ((
  SELECT description FROM UNNEST(all_codes) WHERE code = all_codes
));
SELECT OrderNo, 
  code_mapping(Style_code, codes) Style_desc,
  code_mapping(Color_code, codes) Color_desc,
  code_mapping(Country_code, codes) Country_desc
FROM `project.dataset.table1`
CROSS JOIN (SELECT ARRAY_AGG(t) codes FROM `project.dataset.table2` t)

Вы можете протестировать, поиграть с выше, используя пример данных из вашего вопроса, как в примере ниже

#standardSQL
CREATE TEMP FUNCTION code_mapping(code STRING, all_codes ARRAY<STRUCT<all_codes STRING, description STRING>>) AS ((
  SELECT description FROM UNNEST(all_codes) WHERE code = all_codes
));
WITH `project.dataset.table1` AS (
  SELECT 21540 OrderNo, 'abc' Style_code, 'kdx' Color_code, 'plo' Country_code UNION ALL
  SELECT 21541, 'gcs', 'kdy', 'pla' UNION ALL
  SELECT 21542, 'wer', 'kdz', 'plh' UNION ALL
  SELECT 21543, 'abc', 'kdx', 'pld' UNION ALL
  SELECT 21544, 'gcs', 'kdy', 'plo' 
), `project.dataset.table2` AS (
  SELECT 'abc' all_codes, 'plain' description UNION ALL
  SELECT 'gcs', 'vintage' UNION ALL
  SELECT 'wer', 'modern' UNION ALL
  SELECT 'kdx', 'white' UNION ALL
  SELECT 'kdy', 'gray' UNION ALL
  SELECT 'kdz', 'black' UNION ALL
  SELECT 'plo', 'USA' UNION ALL
  SELECT 'pla', 'Mexico' UNION ALL
  SELECT 'plh', 'Canada' UNION ALL
  SELECT 'pld', 'Brazil' 
)
SELECT OrderNo, 
  code_mapping(Style_code, codes) Style_desc,
  code_mapping(Color_code, codes) Color_desc,
  code_mapping(Country_code, codes) Country_desc
FROM `project.dataset.table1`
CROSS JOIN (SELECT ARRAY_AGG(t) codes FROM `project.dataset.table2` t)

с результатом

Row OrderNo Style_desc  Color_desc  Country_desc     
1   21540   plain       white       USA  
2   21541   vintage     gray        Mexico   
3   21542   modern      black       Canada   
4   21543   plain       white       Brazil   
5   21544   vintage     gray        USA  
0 голосов
/ 03 апреля 2019

Вы хотите несколько join с:

select t1.orderNo, acs.description as style_desc,
       acc.description as color_desc,
       acco.description as country_desc
from table1 t1 left join
     all_codes acs
     on t1.style_code = acs.code left join
     all_codes acc
     on t1.color_code = acc.code left join
     all_codes acco
     on t1.country_code = acco.code ;

Эта версия использует left join, на случай, если какие-либо значения не соответствуют справочной таблице.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...