Динамический SQL Bigquery со ссылочной таблицей и значением

# #google-bigquery #bigquery-udf

Вопрос:

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

введите описание изображения здесь

введите описание изображения здесь

Пользователь может добавить много строк в таблицу ссылок. Мне нужно создать следующий SQL динамически на основе всех записей в Ref_table :

 select sum(case when id=1 then val end)/sum(val) as Red_percent,
    sum(case when id=2 then val end)/sum(val) as Blue_percent,
    sum(case when id=3 then val end)/sum(val) as Green_percent
    from Transaction_table
 

Может ли кто-нибудь, пожалуйста, помочь мне написать динамический sql для генерации выше sql со всеми записями в ref_table?

Ответ №1:

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

 select * from (
  select distinct ref, 
    sum(val) over(partition by ref) / sum(val) over() val
  from ref_table r
  join transaction_table t
  using(id)
)
pivot (min(val) for ref in ('Red', 'Blue', 'Green'))    
 

Во-вторых, ниже приведен способ создания этого на основе содержимого ref_table

 select '''
select * from (
  select distinct ref, 
    sum(val) over(partition by ref) / sum(val) over() val
  from ref_table r
  join transaction_table t
  using(id)
)
pivot (min(val) for ref in (''' || (select string_agg(distinct '"' || ref || '"') from ref_table)  || '''))
'''    
 

Наконец, вы можете просто выполнить его, как в приведенном ниже примере

 execute immediate '''
select * from (
  select distinct ref, 
    sum(val) over(partition by ref) / sum(val) over() val
  from ref_table r
  join transaction_table t
  using(id)
)
pivot (min(val) for ref in (''' || (select string_agg(distinct '"' || ref || '"') from ref_table)  || '''))
'''