【问题标题】:Dynamic Header in BigQueryBigQuery 中的动态标头
【发布时间】:2021-09-04 18:26:31
【问题描述】:

我正在创建一个仪表板,我想在其中显示每个类别每周关闭的项目。这是我的表格示例。

Category Opened Date Closed Date
Sales 06/01/2021 06/02/2021
Product 06/02/2021 06/07/2021
Feedback 06/07/2021 06/14/2021
Sales 05/18/2021 05/23/2021
Product 06/01/2021 06/01/2021
Feedback 06/01/2021 06/05/2021
Sales 05/21/2021 05/24/2021
Product 05/21/2021 05/26/2021
Product 06/01/2021 06/02/2021
Feedback 05/31/2021 06/13/2021
Sales 06/02/2021 06/06/2021
Product 06/04/2021 06/07/2021

这是我想要达到的结果。

每周关闭类别

Category 05/23/2021 05/30/2021 06/06/2021 06/13/2021
Sales 2 1 0 1
Product 1 2 2 0
Feedback 0 0 1 2

我尝试使用 SET 以便动态创建列,但是当我使用 @ 符号时 bigQuery 显示错误。当我使用 column_alias 时,它也会按字面显示列名

SET @column_week1 = DATE_SUBB(CURRENT_DATE, INTERVAL 7 DAYS)

还有其他选择吗?

【问题讨论】:

  • 听起来您实际上想要创建表格的 视图,您可以在其中按类别和完成周聚合 表格源,并使用完成一周作为支点。

标签: google-bigquery


【解决方案1】:

试试execute_immediatepivot 运算符:

DECLARE weeks_list STRING;

create temp table input_table as
select 'Sales' as category, '06/02/2021' as closed_date union all
select 'Product', '06/07/2021' union all
select 'Feedback', '06/14/2021' union all
select 'Sales', '05/23/2021' union all
select 'Product', '06/01/2021' union all
select 'Feedback', '06/05/2021' union all
select 'Sales', '05/24/2021' union all
select 'Product', '05/26/2021' union all
select 'Product', '06/02/2021' union all
select 'Feedback', '06/13/2021' union all
select 'Sales', '06/06/2021' union all
select 'Product', '06/07/2021';

create temp table normalized_table as select category, FORMAT_DATE('_%m_%d_%Y', DATE_TRUNC(PARSE_DATE('%m/%d/%Y', closed_date), WEEK)) as closed_week from input_table;
SET weeks_list = (select string_agg(distinct '"' || closed_week || '"') from normalized_table);
execute immediate 'SELECT * FROM (SELECT category, closed_week FROM normalized_table) PIVOT(count(*) FOR closed_week IN (' || weeks_list || '))';

附言

您可以跳过创建临时normalized_tableweeks_list 变量:

execute immediate (
  select '''
    SELECT * FROM (
      SELECT 
        category,
        FORMAT_DATE("_%m_%d_%Y", DATE_TRUNC(PARSE_DATE("%m/%d/%Y", closed_date), WEEK)) as closed_week
      FROM input_table)
      PIVOT(count(*) FOR closed_week IN (''' || string_agg(distinct '"' || closed_week || '"') || '''))
  '''
  from (
    select
      category,
      FORMAT_DATE("_%m_%d_%Y", DATE_TRUNC(PARSE_DATE("%m/%d/%Y", closed_date), WEEK)) as closed_week
    from input_table
  )
);

【讨论】:

    【解决方案2】:

    你可以一次完成所有相同的操作

    execute immediate (             
    select '''select * from (
      select replace('_' || (last_day(parse_date('%m/%d/%Y', closed), week) - 6), '-', '_') week, 
        category
      from `project.dataset.table`
      )
      pivot(count(*) for week in ("''' ||  string_agg(week, '", "')  || '''"))
    '''
    from (select distinct replace('_' || (last_day(parse_date('%m/%d/%Y', closed), week) - 6), '-', '_') week from `project.dataset.table` order by week) 
    )      
    

    有输出

    还可以查看https://stackoverflow.com/a/67479622/5221944 - 可以帮助您理解上述代码

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-17
      • 2018-09-27
      • 2017-07-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多