SQL Server按AgeGroup分组统计人数及占比百分比结果异常求解
你之前计算结果全为0的核心原因是SQL默认对整数类型执行整数除法,当分子小于分母时,结果会被直接截断为整数0。
方案1:使用已知总人数硬编码
如果你要直接使用你已经统计好的总人数2754691,可以用以下修正后的语句,通过引入浮点型数字100.0触发浮点运算,避免整数截断,输出格式完全符合你的需求:
SELECT AgeGroup, COUNT(*) AS PeopleInAgeGroup, CONCAT(ROUND(COUNT(*) * 100.0 / 2754691, 1), ' %') AS Percent FROM FullData GROUP BY AgeGroup ORDER BY AgeGroup
方案2:自动计算总人数(更通用)
如果你不想硬编码总人数,避免后续表数据变化需要手动修改数值,可以用窗口函数自动统计全表总行数:
SELECT AgeGroup, COUNT(*) AS PeopleInAgeGroup, CONCAT(ROUND(COUNT(*) * 100.0 / SUM(COUNT(*)) OVER (), 1), ' %') AS Percent FROM FullData GROUP BY AgeGroup ORDER BY AgeGroup
其中SUM(COUNT(*)) OVER ()会在分组完成后自动统计所有分组的人数总和,也就是全表的总行数,不需要提前计算填写。
你之前的其他尝试中,用AVG的语句只单独计算了5-Seniors分组的占比,无法输出所有分组的正确结果;最后一种写法因为做了表的笛卡尔积且加了错误的过滤条件,才会出现重复异常结果,不需要再使用。
内容的提问来源于stack exchange,提问作者LNV
相关产品推荐
相关产品推荐

