# #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) || '''))
'''