【问题标题】:SQL Dynamically generate columns based on a map tableSQL 根据映射表动态生成列
【发布时间】:2022-07-22 01:15:41
【问题描述】:

我想根据其他映射表动态生成一个表。我有一个看起来像的映射表,这个映射表连接到一个 excel,用户可以根据需要添加任意多的行来修改:

Name ColumnName
banner banner_flag
pop_up pop_up_flag

然后我有一个如下所示的源表:

id language transactions action
01 es-es 0 banner
02 es-mx 0 loggin
03 es-es 1 pop_up
03 es-es 1 banner
03 es-es 1 loggin
03 es-es 1 back_home
04 es-es 0 loggin
04 es-es 0 banner
04 es-es 0 banner
05 es-es 1 loggin
06 es-es 2 loggin

那么最终的输出应该是这样的:

id language transactions banner_flag pop_up_flag
01 es-es 0 1 0
02 es-mx 0 0 0
03 es-es 0 1 1
04 es-es 0 2 0
05 es-es 0 0 0
06 es-es 0 0 0

与映射表关联的列是计算字段,在伪代码中如下所示:

for x in map_table.ColumnName:
  if x in sourceTable.Column:
    return 1
  else:
    return 0

【问题讨论】:

  • 交易列是如何计算的?

标签: sql dynamic google-bigquery pivot


【解决方案1】:

考虑以下方法

execute immediate (select '''select * from (
  select id, language, sum(if(action = Name, 0, transactions)) as transactions, ColumnName, countif(action = Name) as flag
  from source_table s
  cross join map m 
  group by id, language, ColumnName
)
pivot (sum(flag) for ColumnName in ("''' || list || '''"))
order by id
''' 
from (select string_agg(distinct ColumnName, '","') as list from map)
)      

如果应用于您问题中的样本数据 - 输出是

【讨论】:

    猜你喜欢
    • 2016-06-05
    • 1970-01-01
    • 2021-10-11
    • 1970-01-01
    • 2021-07-07
    • 1970-01-01
    • 2021-07-13
    • 2010-12-19
    相关资源
    最近更新 更多