2015-08-26 2 views
1

Мой вопрос похож на этот How to simulate a pivot table with BigQuery?. Но представьте, что у вас есть непредсказуемое количество строк, поэтому вы не можете перечислить их в инструкции IF. Итак, есть ли способ принять значения DISTINCT из одного столбца и создать список столбцов из него?Генерировать столбцы из строк автоматически (без IF)

ответ

3

Очень простой пример ниже, чтобы показать подход:

Предположим, у вас есть temp.example таблицу:

select * from 
(select '2015-08-01' as day, 1 as category, 11 as volume), 
(select '2015-08-01' as day, 2 as category, 21 as volume), 
(select '2015-08-01' as day, 3 as category, 31 as volume), 
(select '2015-08-02' as day, 1 as category, 101 as volume), 
(select '2015-08-02' as day, 2 as category, 201 as volume), 
(select '2015-08-03' as day, 1 as category, 301 as volume), 
(select '2015-08-03' as day, 2 as category, 302 as volume), 
(select '2015-08-03' as day, 4 as category, 304 as volume) 

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

select 
    day, 
    sum(if(category = 1, volume, 0)) as category_1, 
    sum(if(category = 2, volume, 0)) as category_2, 
    sum(if(category = 3, volume, 0)) as category_3, 
    sum(if(category = 4, volume, 0)) as category_4 
from temp.example 
group by day 
order by day 

Ниже описана гБк код, который делает именно это

select 'select day, ' + 
    group_concat_unquoted('sum(if(category = ' + string(category) + ', volume, 0)) as category_' + string(category)) 
    + ' from temp.example group by day order by day' 
from (select category from temp.example group by category order by category) 

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

 
day   category_1 category_2 category_3 category_4 
2015-08-01   11   21   31   0 
2015-08-02   101   201   0   0 
2015-08-03   301   302   0   304 
+0

Это действительно высокий уровень SQL! Спасибо! Конечно, это не динамично, но я думаю, что это лучшее решение на данный момент. –

0

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

+0

Попытка думать, если есть какие-то способы, чтобы сделать это с помощью нового пользователя отличать Задаваемые функции: HTTPS://cloud.google.com/bigquery/user-defined-functions –

Смежные вопросы