如何在Google Data Studio中用CASE表达式匹配BigQuery数据集多行
解决BigQuery中按分隔符分割的类别分组问题
针对你在Google Data Studio中连接BigQuery表,需要按Categories列里的分隔类别分组的需求,这里提供两种可行的方案,其中包含你提到的CASE表达式用法:
方案1:先拆分类别为多行再分组(更直观高效)
你的Categories列格式带前后/和空格,第一步需要清洗字符串并拆分成单个类别,再通过UNNEST展开成独立行,之后就能轻松分组统计了。修改你的SQL如下:
#standardSQL WITH cleaned_categories AS ( SELECT ID, Location, Calories, -- 清洗字符串:去掉首尾的/和空格,再按" / "拆分 TRIM(Categories, '/ ') AS cleaned_cat, FROM table_name ), split_categories AS ( SELECT ID, Location, Calories, -- 拆分并展开成单个类别行 category FROM cleaned_categories, UNNEST(SPLIT(cleaned_cat, ' / ')) AS category ) -- 这里可以根据你的需求分组统计,比如按category计数或者求和Calories SELECT category, COUNT(DISTINCT ID) AS item_count, SUM(CAST(Calories AS INT64)) AS total_calories FROM split_categories GROUP BY category ORDER BY item_count DESC;
这个方案的好处是把每个类别拆成独立行,后续不管是在Data Studio里做图表还是统计都非常灵活。
方案2:使用CASE表达式标记每个类别(适合固定类别场景)
如果你的类别是相对固定的,不想拆分行,而是用CASE表达式为每个类别创建标记列,之后再分组聚合,可以这样写:
#standardSQL SELECT -- 按Location分组,或者你需要的其他维度 Location, -- 匹配每个类别,存在则计数1,否则0 SUM(CASE WHEN Categories LIKE '% / brown / %' THEN 1 ELSE 0 END) AS brown_count, SUM(CASE WHEN Categories LIKE '% / nutty / %' THEN 1 ELSE 0 END) AS nutty_count, SUM(CASE WHEN Categories LIKE '% / salty / %' THEN 1 ELSE 0 END) AS salty_count, SUM(CASE WHEN Categories LIKE '% / roasted / %' THEN 1 ELSE 0 END) AS roasted_count FROM table_name GROUP BY Location;
注意事项
- 匹配类别时用
% / brown / %而非%brown%,是为了避免类似brownie这类包含目标子串的无关值被误匹配,通过前后的/作为边界能保证匹配准确性。 - 你的
Calories列是字符串类型,做聚合计算前记得用CAST(Calories AS INT64)转换为数值类型,否则会报错或得到错误结果。 - 在Data Studio中直接替换原有SQL即可,之后就能基于生成的类别字段创建饼图、条形图等可视化报表。
内容的提问来源于stack exchange,提问作者J. Ayo
相关产品推荐
相关产品推荐

