在 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))
如果应用于您问题中的示例数据 - 输出为
我目前有一个 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))
如果应用于您问题中的示例数据 - 输出为