如何统计两类参数的数量?按品牌统计食品事件中男女消费者数量
按品牌统计男女消费者数量的正确解法
原代码的问题
你的代码存在几个明显错误,导致语法报错且逻辑失效:
- 语法错误:WHERE子句中
consumer_gender = "Male"后直接接子查询,缺少AND/OR这类逻辑连接符,BigQuery无法解析这个结构。 - 逻辑错误:子查询里试图用
COUNT(products_brand_name - total_males)计算女性数量完全不成立——total_males是外层查询的别名,子查询无法直接引用;而且COUNT()是统计非NULL值的数量,不是用来做数值减法的。 - 思路偏差:你想通过总数减男性数得到女性数,但代码里根本没有先统计总人数,反而在子查询里做无意义的运算。
正确写法一:用CASE WHEN一次性统计
这是最简洁的方式,通过条件计数分别统计男女数量:
SELECT products_brand_name, -- 统计性别为Male的行数,不符合的返回NULL,COUNT会忽略NULL COUNT(CASE WHEN consumer_gender = "Male" THEN 1 END) AS total_males, COUNT(CASE WHEN consumer_gender = "Female" THEN 1 END) AS total_females FROM `bigquery-public-data.fda_food.food_events` GROUP BY products_brand_name LIMIT 10
正确写法二:分表统计后关联
如果需要单独处理男女数据,可以先分别统计,再通过全连接合并结果,避免某类性别数据缺失:
-- 先统计男性各品牌数量 WITH male_counts AS ( SELECT products_brand_name, COUNT(*) AS total_males FROM `bigquery-public-data.fda_food.food_events` WHERE consumer_gender = "Male" GROUP BY products_brand_name ), -- 再统计女性各品牌数量 female_counts AS ( SELECT products_brand_name, COUNT(*) AS total_females FROM `bigquery-public-data.fda_food.food_events` WHERE consumer_gender = "Female" GROUP BY products_brand_name ) -- 全连接补全缺失的品牌数据,用IFNULL把NULL转为0 SELECT COALESCE(m.products_brand_name, f.products_brand_name) AS products_brand_name, IFNULL(m.total_males, 0) AS total_males, IFNULL(f.total_females, 0) AS total_females FROM male_counts m FULL OUTER JOIN female_counts f ON m.products_brand_name = f.products_brand_name LIMIT 10
内容的提问来源于stack exchange,提问作者paulo sampieri
相关产品推荐
相关产品推荐

