如何在SQL中计算分类数据占比?需为分组结果新增百分比列
解决方法
可以通过先聚合各城市的统计数据,再用窗口函数计算总数占比,修改后的SQL如下:
WITH city_counts AS ( SELECT city, COUNT(DISTINCT id) AS CountofGoogle FROM TABLE WHERE company_name = 'Google' GROUP BY city ) SELECT city, CountofGoogle, ROUND((CountofGoogle * 100.0) / SUM(CountofGoogle) OVER (), 2) AS Percentage FROM city_counts ORDER BY CountofGoogle DESC;
说明:
- 先用CTE(
city_counts)聚合每个城市的独立ID数量,避免原SQL中DISTINCT(city)和窗口函数搭配的冗余问题。 SUM(CountofGoogle) OVER ()会计算所有城市的CountofGoogle总和(不加分区就是全局总数)。- 乘以
100.0是为了把小数转成百分比形式,ROUND(..., 2)是保留两位小数,可根据需求调整位数。
如果你的SQL版本不支持CTE,也可以用子查询实现:
SELECT city, CountofGoogle, ROUND((CountofGoogle * 100.0) / SUM(CountofGoogle) OVER (), 2) AS Percentage FROM ( SELECT city, COUNT(DISTINCT id) AS CountofGoogle FROM TABLE WHERE company_name = 'Google' GROUP BY city ) AS city_counts ORDER BY CountofGoogle DESC;
原SQL报错的核心原因是直接在原查询里叠加SUM窗口函数时,原查询的partition by city窗口和全局总数的窗口逻辑冲突,先做分组聚合再计算占比会更清晰且避免错误。
内容的提问来源于stack exchange,提问作者LottesofCode
相关产品推荐
相关产品推荐

