SQL两表INNER JOIN后基于含YES/NO的column1计算占比问题
问题原因
你编写的SQL无法运行主要是三个问题:
- 不能在
COUNT()聚合函数内部直接使用WHERE子句做条件筛选,需要用CASE WHEN表达式实现条件计数 - 字符串值
YES、NO没有加单引号包裹,会被SQL解析器识别为字段名触发报错 - 直接使用普通聚合函数时没有搭配
GROUP BY子句,会导致明细行和聚合逻辑冲突,同时要注意整数除法的截断问题,避免计算结果为0
修复方案
场景1:保留原查询的所有明细行,每行附带全局YES/NO占比
如果你需要保留原来的x、y、column1所有明细数据,同时每行都显示整体的YES、NO占比,使用窗口函数实现:
SELECT x, y, column1, COUNT(CASE WHEN column1 = 'YES' THEN 1 END) OVER () * 1.0 / COUNT(*) OVER () AS COLUMN_YES, COUNT(CASE WHEN column1 = 'NO' THEN 1 END) * 1.0 / COUNT(*) OVER () AS COLUMN_NO FROM BASE1 as a INNER JOIN BASE2 ON a.ID = BASE2.ID;
OVER() 表示窗口统计的范围是全局所有匹配行,乘以1.0是为了将整数计数转换为小数运算,避免整数除法导致结果被截断为0。
场景2:仅需要统计整体占比,不需要明细行
如果你只需要返回全局的YES、NO占比结果,不需要保留明细数据,直接使用条件聚合即可:
SELECT COUNT(CASE WHEN column1 = 'YES' THEN 1 END) * 1.0 / COUNT(*) AS COLUMN_YES, COUNT(CASE WHEN column1 = 'NO' THEN 1 END) * 1.0 / COUNT(*) AS COLUMN_NO FROM BASE1 as a INNER JOIN BASE2 ON a.ID = BASE2.ID;
另外注意你给BASE1设置了别名a,关联条件里最好用a.ID代替BASE1.ID,避免部分数据库不识别原表名。
内容的提问来源于stack exchange,提问作者cail
相关产品推荐
相关产品推荐

