You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何统计两类参数的数量?按品牌统计食品事件中男女消费者数量

按品牌统计男女消费者数量的正确解法

原代码的问题

你的代码存在几个明显错误,导致语法报错且逻辑失效:

  1. 语法错误:WHERE子句中consumer_gender = "Male"后直接接子查询,缺少AND/OR这类逻辑连接符,BigQuery无法解析这个结构。
  2. 逻辑错误:子查询里试图用COUNT(products_brand_name - total_males)计算女性数量完全不成立——total_males是外层查询的别名,子查询无法直接引用;而且COUNT()是统计非NULL值的数量,不是用来做数值减法的。
  3. 思路偏差:你想通过总数减男性数得到女性数,但代码里根本没有先统计总人数,反而在子查询里做无意义的运算。

正确写法一:用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 03:55:07