Как получить соответствующие столбцы из таблицы BigQuery со значениями, соответствующими из другого присоединенного столбца таблицы? - PullRequest
0 голосов
/ 14 июля 2020

СЦЕНАРИЙ: Имеются две таблицы BigQuery A и B с несколькими столбцами и общим ключевым столбцом. Необходимо объединить обе таблицы с общим ключевым столбцом, а также получить соответствующие значения из другой таблицы, как указано в примере ниже.

INPUT: Есть две таблицы

Таблица A:

store   category    city
11      aaa         xx
12      bbb         yy
12      ccc         zz
13      ddd         xy

Таблица B:

store   sale1   sale2   sale3
11      0.5     0.75    0.25
12      1.2     1.25    1.23
13      0.9     0.87    0.54

ОЖИДАЕМЫЙ ВЫХОД - Таблица результатов C:

store   category    city    sale
11      aaa         xx      0.5
12      bbb         yy      1.25
12      ccc         zz      1.23
13      ddd         xy      0.87

ОБЪЯСНЕНИЕ ВЫХОДА:

Точка 1: Соединение двух таблиц с общим столбцом 'store'

Пункт 2: Проверьте, если столбец category == 'aaa', затем выберите столбец 'sale1' из таблицы B и, если категория в ('bbb', 'ddd'), затем выберите столбец 'sale2' и если категория == 'ccc', затем выберите столбец 'sale3' и сохраните соответствующее значение в таблице результатов C как столбец 'sale'.

TRIED BIGQUERY:

with res as 
    (select 
    a.store,
    a.category,
    a.city
    )
SELECT store, category, city,   
    case
        when category in ('aaa') then sale=b.sale1
        when category in ('bbb','ddd') then sale=b.sale2
        when category in ('ccc') then sale=b.sale3
    end
    as sale
FROM `tableA` AS a
JOIN `tableB` AS b
ON a.store = CAST(b.store AS STRING)

Нужна помощь. Заранее спасибо!

Ответы [ 2 ]

2 голосов
/ 14 июля 2020

Вы можете использовать выражение case:

select a.store, a.category,
       (case when a.category = 'aaa' then b.sale1
             when a.category in ('bbb', 'ddd') then b.sale2
             when a.category in ('ccc') then b.sale3
        end) as sale
from `tableA` a join
     `tableB` b
     on a.store = cast(b.store as string) ;

На самом деле ваш запрос в основном правильный (хотя CTE излишний), за исключением выражения case. sale= не подходит. Выражение case возвращает значение. Затем его можно назначить столбцу с помощью as.

0 голосов
/ 14 июля 2020

Ниже приведено для стандарта BiQquery SQL

Решение, приведенное ниже, может выглядеть как чрезмерная инженерия, но это может быть вашим предпочтением в тех случаях, когда вы хотите сохранить свои правила сопоставления отдельно от кода и / или количества такие правила сделают код неуправляемым, et c.

#standardSQL
WITH map AS (
  SELECT 'sale1' column, ['aaa'] categories UNION ALL
  SELECT 'sale2', ['bbb', 'ddd'] UNION ALL
  SELECT 'sale3', ['ccc']
)
SELECT a.*, SPLIT(kv, ':')[SAFE_OFFSET(1)] sale
FROM `project.dataset.tableA` a
JOIN `project.dataset.tableB` b
  ON a.store = CAST(b.store AS STRING)
JOIN map m
  ON a.category IN UNNEST(m.categories)
JOIN UNNEST(SPLIT(TRIM(TO_JSON_STRING(b), '{}'))) kv
  ON TRIM(SPLIT(kv, ':')[SAFE_OFFSET(0)], '"') = m.column

Если применить приведенный выше код к образцу данных из вашего вопроса - результат будет

Row store   category    city    sale     
1   11      aaa         xx      0.5  
2   12      bbb         yy      1.25     
3   12      ccc         zz      1.23     
4   13      ddd         xy      0.87     
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...