Извлечение данных из одного столбца и сохранение в другом на основе условия - PullRequest
0 голосов
/ 22 апреля 2020

Данные, которые у меня есть, выглядят ниже -

ID      category     Type_1     Type_2     Match?      Quantity
123       1            A          B       no match        2
123       2            A          B       no match        1
123       3            A          B       no match        6
123       4            A          B       no match        6
123       5            A          B       no match        9
123       6            A          B       no match        1
456       1            A          A        match          6
456       2            A          A        match          4
456       3            A          A        match          4
456       4            A          A        match          3
456       5            A          A        match          0
456       6            A          A        match          1

Я хочу реструктурировать эту таблицу, выполнив следующее -

1) Когда категория равна 3 Я хочу создать еще один столбец cat_3 и сохранить под ним Type_2 для категории 3 . Создайте еще один столбец Количество_3 и сохраните под ним значение , соответствующее 3 .

2) Для всех других категорий, кроме 3 , я хочу создать еще один столбец Other_categories и сохранить под ним Type_1 , соответствующий другим категориям . Создайте еще один столбец Quantity_for_other_categories и сохраните сумму величин, соответствующих всем другим категориям , ниже.

Результат должен выглядеть следующим образом-

ID    cat_3     Quantity_3     Other_categories   Quantity_for_other_categories    Match?
123     B           6                 A                       19                   no match
456     A           4                 A                       14                   match

Ответы [ 2 ]

1 голос
/ 23 апреля 2020

Ниже для BigQuery Standard SQL

#standardSQL
SELECT id, cat_3, Quantity_3, Other_categories, Quantity_for_other_categories, Match
FROM (
  SELECT id, 
    Type_2 AS cat_3,
    Quantity AS Quantity_3,
    Match
  FROM `project.dataset.table`
  WHERE category = 3
  ORDER BY id
) FULL OUTER JOIN (
  SELECT id, 
    Type_1 AS  Other_categories,
    SUM(Quantity) AS Quantity_for_other_categories,  
    Match
  FROM `project.dataset.table`
  WHERE category != 3
  GROUP BY id, Type_1, Match
)
USING(id, Match)
-- ORDER BY id   

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

Row id  cat_3   Quantity_3  Other_categories    Quantity_for_other_categories   Match    
1   123 B       6           A                   19                              no match     
2   456 A       4           A                   14                              match    
0 голосов
/ 22 апреля 2020

Вы можете сделать условную агрегацию. Предполагая, что type_1, type_2 и match фиксированы для каждого id, вы можете сделать:

select 
    id,
    type_2 cat_3,
    sumif(quantity, category = 3) quantity_3,
    type_1 other_categories,
    sumif(quantity, category <> 3) quantity_for_other_catgories,
    match
from mytable
group by id, type_2, type_1, match
...