Как создать кросс-таблицу с двумя полями в BigQuery со стандартным или устаревшим SQL - PullRequest
0 голосов
/ 11 мая 2018

Я хочу получить две колонки из таблицы и создать кросс-таблицу, чтобы увидеть, сколько товаров куплено в какой категории товаров для каждого покупателя.Вот пример данных из моей таблицы:

Row     Customer_ID     Style    
 1      MEM014          BLS87    
 2      KAR810          DR126    
 3      NIKE61          MMQ5     
 4      NIKE61          MMQ5     
 5      STT019          BLS83    
 6      STT019          BLS84    
 7      STT019          BLS87    

И я хочу получить таблицу результатов следующим образом:

Customer - DR126 - MMQ5 - BLS83 - BLS84 - BLS87
MEM014       0       0      0       0       1
KAR810       1       0      0       0       0
NIKE61       0       2      0       0       0
STT019       0       0      1       1       1   

Ответы [ 2 ]

0 голосов
/ 12 мая 2018

Ниже для стандартного SQL BigQuery

Шаг # 1 - сгенерируйте сводный запрос

  #standardSQL
  SELECT CONCAT(
  "SELECT Customer_ID,", 
  STRING_AGG(CONCAT("COUNTIF(Style='", Style, "') ", Style)), 
  " FROM `project.dataset.your_table` GROUP BY Customer_ID ORDER BY Customer_ID")
  FROM (
    SELECT DISTINCT Style
    FROM `project.dataset.your_table`
    ORDER BY Style
  )    

Если вы запустите его с фиктивными данными из вашего вопроса, как показано ниже

  #standardSQL
  WITH `project.dataset.your_table` AS (
    SELECT 'MEM014' Customer_ID, 'BLS87' Style UNION ALL    
    SELECT 'KAR810', 'DR126' UNION ALL    
    SELECT 'NIKE61', 'MMQ5' UNION ALL     
    SELECT 'NIKE61', 'MMQ5' UNION ALL     
    SELECT 'STT019', 'BLS83' UNION ALL    
    SELECT 'STT019', 'BLS84' UNION ALL    
    SELECT 'STT019', 'BLS87' 
  )
  SELECT CONCAT(
  "SELECT Customer_ID,", 
  STRING_AGG(CONCAT("COUNTIF(Style='", Style, "') ", Style)), 
  " FROM `project.dataset.your_table` GROUP BY Customer_ID")
  FROM (
    SELECT DISTINCT Style
    FROM `project.dataset.your_table`
    ORDER BY Style
  )

вы получите следующий сводный запрос

SELECT Customer_ID,COUNTIF(Style='BLS83') BLS83,COUNTIF(Style='BLS84') BLS84,COUNTIF(Style='BLS87') BLS87,COUNTIF(Style='DR126') DR126,COUNTIF(Style='MMQ5') MMQ5 FROM `project.dataset.your_table` GROUP BY Customer_ID

Шаг # 2 - запустить сгенерированный сводный запрос

, если вы запустите его для своего манекенаdata - вы получите ожидаемый результат

Row Customer_ID BLS83   BLS84   BLS87   DR126   MMQ5     
1   KAR810      0       0       0       1       0    
2   MEM014      0       0       1       0       0    
3   NIKE61      0       0       0       0       2    
4   STT019      1       1       1       0       0      

Примечание 1 : выше предполагается, что имена стилей соответствуют соглашению имен столбцов (как в вашем примере).Если нет - вам потребуется экранировать неподдерживаемые символы и т. Д. (Простая настройка для шага 1)
Примечание 2 : максимальная длина неразрешенного запроса составляет 256 КБ.Поэтому, если ваши имена стилей аналогичны именам в вашем примере - решение, приведенное выше, будет поддерживать около 8500 стилей, что должно быть меньше предела (10K?) Для числа столбцов в таблице

0 голосов
/ 11 мая 2018

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

select customer,
       sum(case when style = 'DR126' then 1 else 0 end) as DR126,
       sum(case when style = 'MMQ5' then 1 else 0 end) as MMQ5,
       . . .
from t
group by customer;

Это работает, если у вас есть точный список стилей. Если нет, то вы должны думать с точки зрения массивов для набора результатов.

EDIT:

Вы можете создать массив структур, если это больше соответствует вашим целям:

select customer, array_agg(cs) as styles
from (select customer, style, count(*) as cnt
      from t
      group by customer
     ) cs
group by customer;

То, что вы не можете сделать, это сделать запрос, возвращающий переменное количество столбцов. Для этого вам нужен динамический SQL и язык программирования.

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