在 Bigquery 中旋转 table 时出现意外错误

Unnexpected error while pivoting table in Bigquery

我目前有一个 table,其中包含以下信息:

age_of_opps number_of_opps
2021-01-01 0 - 10 10
2021-01-01 11 - 20 1
2021-01-01 21 - 30 7
2021-02-01 0 - 10 2
2021-02-01 11 - 20 20
2021-02-01 21 - 30 12

(以此类推)

我需要旋转“age_of_opps”列,每个月只保留一行,总结每个单元格中的机会数,如下所示:

0 - 10 11 - 20 21 - 30
2021-01-01 10 1 7
2021-02-01 2 20 12

我尝试了以下查询,但在 base_two:

的第一个 CASE WHEN 语句行中,我不断收到“语法错误:意外的字符串文字‘0-10’”
WITH base_one AS(
SELECT 
   month,
   CASE 
        WHEN ROUND(AVG(DATE_DIFF(CAST(current_date AS DATE), CAST(creation_date AS DATE), DAY))) BETWEEN 0 AND 10 THEN '0-10'
        WHEN ROUND(AVG(DATE_DIFF(CAST(current_date AS DATE), CAST(creation_date AS DATE), DAY))) BETWEEN 11 AND 20 THEN '11-20'
        WHEN ROUND(AVG(DATE_DIFF(CAST(current_date AS DATE), CAST(creation_date AS DATE), DAY))) BETWEEN 21 AND 30 THEN '21-30'
        WHEN ROUND(AVG(DATE_DIFF(CAST(current_date AS DATE), CAST(creation_date AS DATE), DAY))) BETWEEN 31 AND 40 THEN '31-40'
        WHEN ROUND(AVG(DATE_DIFF(CAST(current_date AS DATE), CAST(creation_date AS DATE), DAY))) BETWEEN 41 AND 50 THEN '41-50'
        WHEN ROUND(AVG(DATE_DIFF(CAST(current_date AS DATE), CAST(creation_date AS DATE), DAY))) BETWEEN 51 AND 60 THEN '51-60'
        END AS age_of_opps,
    COUNT(*) AS opps_per_age

FROM `fictional_db_1` 

GROUP BY 1
),

base_two AS(
SELECT  
     month,
     CASE WHEN age_of_opps = '0-10' THEN SUM(opps_per_age) END AS '0-10',
     CASE WHEN age_of_opps = '11-20' THEN SUM(opps_per_age) END AS '11-20',
     CASE WHEN age_of_opps = '21-30' THEN SUM(opps_per_age) END AS '21-30',
     CASE WHEN age_of_opps = '31-40' THEN SUM(opps_per_age) END AS '31-40',
     CASE WHEN age_of_opps = '41-50' THEN SUM(opps_per_age) END AS '41-50',
     CASE WHEN age_of_opps = '51-60' THEN SUM(opps_per_age) END AS '51-60'

FROM base_one

GROUP BY 1

我不确定是否继续,因为我需要在单引号之间写下列的名称...请帮忙!

我想你只是想要条件聚合::

select month,
       sum(case when age_of_opps = '0 - 10' then number_of_opps end) as num_0_10,
       sum(case when age_of_opps = '11 - 20' then number_of_opps end) as num_11_20,
       sum(case when age_of_opps = '21 - 30' then number_of_opps end) as num_21-30
from t
group by month

IF 是特定于 BigQuery 的,但更短一些:

select month,
       sum(if(age_of_ops = '0 - 10', opps_per_age, 0)) as age_0_10,
       sum(if(age_of_ops = '11 - 20', opps_per_age, 0)) as age_11_20,
       sum(if(age_of_ops = '21 - 30', opps_per_age, 0)) as age_21_30,
from base_one
group by month

考虑以下解决方案

select * from
  (select * from `project.dataset.your_table`)
  pivot(sum(number_of_opps) for age_of_opps in ('0 - 10' _0_10, '11 - 20' _11_20, '21 - 30' _21_30))

如果应用于您问题中的示例数据 - 输出为