提问人:learner_one 提问时间:11/4/2023 最后编辑:learner_one 更新时间:11/7/2023 访问量:75
如何使用子查询或其他方法向此 bigquery/sql 查询添加新列
How to add a new column to this bigquery/sql query using a subquery or other method
问:
我创建了这个查询:
SELECT
country,
place,
label_date,
SUM(CASE
WHEN Category = 'cat1' THEN Value
ELSE
0
END
) AS t_s,
SUM(CASE
WHEN Category = 'cat2' THEN Value
ELSE
0
END
) AS non_ps,
SUM(CASE
WHEN Category = 'cat3' THEN Value
ELSE
0
END
) AS f_h,
SUM(CASE
WHEN Category = 'cat4' THEN Value
ELSE
0
END) AS f_s,
SUM(CASE
WHEN Category = 'cat5' THEN Value
ELSE
0
END) AS o_hp,
SUM(CASE
WHEN Category = 'cat6' THEN Value
ELSE
0
END) AS o_hps,
SUM(CASE
WHEN Category = 'cat7' THEN Value
ELSE
0
END) AS a_s,
SUM(CASE
WHEN Category = 'cat8' THEN Value
ELSE
0
END) AS u_s
FROM
`my_database`
where country is not null group by country, place, label_date order by country desc
现在我有另一个查询:
select country, place, label_date, if((sum(value)/count(Value))=0,1,sum(value)/count(Value)) as s_u from `my_database` where Category = 'cat9' group by country, place, label_date
我想添加它,但我不能。
我试过做这个连接:
FROM
`my_database` as main
JOIN(select country, place, label_date, if((sum(value)/count(Value))=0,1,sum(value)/count(Value)) as s_u from `my_database` where Category = 'cat9' group by country, place, label_date) as s_u ON main.country = s_u.country
where country is not null group by country, place, label_date order by country desc
我使用了国家/地区,因为遗憾的是我没有唯一的 ID,但我得到错误国家/地区是多余的。
我也试过这个:
SUM(CASE
WHEN Category = 'cat8' THEN Value
ELSE
0
END) AS u_s,
SUM(CASE
WHEN Category = 'cat9' THEN if((sum(value)/count(Value))=0,1,sum(value)/count(Value))
ELSE
0
END) AS u_s
FROM
`my_database`
where country is not null group by country, place, label_date order by country desc
但现在我得到了一个可以聚合聚合的错误。
编辑以添加示例数据:
我需要以这种方式获得数据,而不是像这样超过一行的国家/地区显示。
如果我再添加一个没有聚合的情况,bigquery 将显示以下内容:选择既不分组也不聚合的列表表达式引用
答:
0赞
digital.aaron
11/4/2023
#1
此处可能需要采取的方法是拆分聚合,并对记录 where 和非 null 国家/地区值进行一些计算。Category = 'cat9'
我们将计算这些记录,并按国家/地区、地点和label_date分组,就像您的第一个查询一样,以及 .然后,我们将原始的第一个查询放在另一个聚合的 CTE 中,然后在最后选择并将它们连接在一起,同时添加用于计算的条件逻辑。COUNT()
SUM(value)
s_u
WITH Cat9s AS
(
SELECT
country
, place
, label_date
, COUNT(*) AS TotalCat9s
, SUM(IFNULL(value,0)) AS Cat9Sum
FROM `my_database`
WHERE Category = 'cat9'
AND country IS NOT NULL
GROUP BY country
, place
, label_date
)
,Aggregations AS
(
SELECT
country,
place,
label_date,
SUM(CASE
WHEN Category = 'cat1' THEN Value
ELSE
0
END
) AS t_s,
SUM(CASE
WHEN Category = 'cat2' THEN Value
ELSE
0
END
) AS non_ps,
SUM(CASE
WHEN Category = 'cat3' THEN Value
ELSE
0
END
) AS f_h,
SUM(CASE
WHEN Category = 'cat4' THEN Value
ELSE
0
END) AS f_s,
SUM(CASE
WHEN Category = 'cat5' THEN Value
ELSE
0
END) AS o_hp,
SUM(CASE
WHEN Category = 'cat6' THEN Value
ELSE
0
END) AS o_hps,
SUM(CASE
WHEN Category = 'cat7' THEN Value
ELSE
0
END) AS a_s,
SUM(CASE
WHEN Category = 'cat8' THEN Value
ELSE
0
END) AS u_s
FROM
`my_database`
where country is not null
GROUP by country, place, label_date
)
SELECT
a.country
,a.place
,a.label_date
,a.t_s
,a.non_ps
,a.f_h
,a.f_s
,a.o_hp
,a.o_hps
,a.a_s
,a.u_s
,CASE WHEN c.Cat9Sum = 0 THEN 1
WHEN c.Cat9Sum <> 0 THEN c.Cat9Sum / c.TotalCat9s
ELSE NULL END AS s_u
FROM Aggregations a
LEFT JOIN Cat9s c ON a.country = c.country
AND a.place = c.place
AND a.label_date = c.label_date
评论
0赞
digital.aaron
11/4/2023
@learner_one 如果您添加一些示例数据,特别是导致重复的数据,我可以帮助您进一步优化查询。
上一个:子查询和利用 WITH [重复]
评论