如何在Snowflake中按国家分组计算FALSE/(FALSE+TRUE)行级结果?
按国家分组计算FALSE/(FALSE+TRUE)的Snowflake SQL实现
正确查询语句
SELECT t2.Country_Name, COUNT(CASE WHEN t1.Drink = FALSE THEN 1 END) AS F, COUNT(CASE WHEN t1.Drink = TRUE THEN 1 END) AS T, -- 避免除数为0的报错,无有效记录时返回NULL CASE WHEN COUNT(CASE WHEN t1.Drink IN (TRUE, FALSE) THEN 1 END) = 0 THEN NULL ELSE COUNT(CASE WHEN t1.Drink = FALSE THEN 1 END) / COUNT(CASE WHEN t1.Drink IN (TRUE, FALSE) THEN 1 END) END AS total FROM Table1 t1 LEFT JOIN Table2 t2 ON t2.Country_ID = t1.Country_ID GROUP BY t2.Country_Name -- 可选:过滤无有效Drink记录的国家 HAVING COUNT(CASE WHEN t1.Drink IN (TRUE, FALSE) THEN 1 END) > 0;
原查询问题说明
你之前用UNION的方式会把每个国家的FALSE、TRUE统计结果分成两行,无法在同一行内直接计算比例;另外GROUP BY已经保证了Country_Name的唯一性,语句中的DISTINCT属于多余操作。
关键逻辑解释
- 条件聚合:用
CASE WHEN配合COUNT,在每个国家分组内分别统计Drink为FALSE和TRUE的记录数,COUNT会自动忽略NULL值,仅统计满足条件的行。 - 除数为0处理:通过
CASE判断有效记录总数(TRUE+FALSE)是否为0,避免出现除以0的报错。 - 字段替换:如果要计算Food的比例,只需把语句中的
Drink替换为Food即可。
内容的提问来源于stack exchange,提问作者Alan Iza
相关产品推荐
相关产品推荐

