SQL条件聚合:如何基于流失总数计算分组流失占比
解决方案:按性别计算流失客户占总流失客户的比例
核心思路
你需要以总流失客户数为分母,计算每个性别流失客户数的占比。这里提供两种高效的实现方式:
方法1:使用窗口函数(推荐)
利用窗口函数SUM(COUNT(*)) OVER()直接获取所有流失客户的总数,无需额外子查询:
SELECT Gender AS 性别, ROUND(COUNT(*) * 100.0 / SUM(COUNT(*)) OVER (), 1) || '%' AS 流失占比 FROM customer_churn WHERE churn_value = 1 GROUP BY Gender;
- 逻辑说明:
WHERE churn_value = 1先过滤出所有流失客户GROUP BY Gender统计每个性别的流失客户数量SUM(COUNT(*)) OVER()计算所有分组的流失数总和(即总流失客户数1869)ROUND(...,1)保留1位小数,拼接%符号生成百分比格式
方法2:先计算总流失数(兼容老版本SQL)
如果你的数据库不支持窗口函数,可以先通过CTE或子查询算出总流失客户数,再关联计算:
WITH total_churn AS ( SELECT COUNT(*) AS total FROM customer_churn WHERE churn_value = 1 ) SELECT Gender AS 性别, ROUND(COUNT(*) * 100.0 / tc.total, 1) || '%' AS 流失占比 FROM customer_churn, total_churn tc WHERE churn_value = 1 GROUP BY Gender, tc.total;
- 逻辑说明:
total_churnCTE先算出总流失客户数- 主查询过滤流失客户后,关联总流失数计算占比
注意事项
- 必须用
100.0而非100,避免整数除法导致结果为0 - 不同数据库的字符串拼接语法略有差异:
- MySQL:用
CONCAT(ROUND(...), '%') - SQL Server:用
CAST(ROUND(...) AS VARCHAR) + '%' - PostgreSQL:用
ROUND(...) || '%'(示例中使用的语法)
- MySQL:用
内容的提问来源于stack exchange,提问作者Lana
相关产品推荐
相关产品推荐

