SQL查询计算医疗事件占比仅返回0值,求技术解决方案
问题分析与解决
你遇到的占比全为0的问题,核心是SQL整数除法的截断特性:当两个整数相除时,结果会自动舍弃小数部分取整。你的原查询里COUNT(Severity)返回整数,158420也是整数,所以哪怕专科事件数不为0,只要小于158420,除法结果都会被截断为0。
修复方案
方案1:避免硬编码总事件数(推荐)
用子查询动态获取总事件数,既保证准确性,也不用手动维护数字:
WITH CTE_TotalEvents AS ( SELECT COUNT(Severity) AS Total_Malpractice_Events FROM MedMal85 ), CTE_SpecialtyEvents AS ( SELECT Specialty, COUNT(Severity) AS Total_Events FROM MedMal85 GROUP BY Specialty ) SELECT Specialty, Total_Events, -- 将事件数转为浮点型,触发浮点除法 CAST(Total_Events AS FLOAT) / (SELECT Total_Malpractice_Events FROM CTE_TotalEvents) AS Percentage_of_Total_Events FROM CTE_SpecialtyEvents;
方案2:直接修改除法运算
把硬编码的分母转为浮点型,让计算保留小数:
SELECT Specialty, COUNT(Severity) AS Total_Events, COUNT(Severity) / CAST(158420 AS FLOAT) AS Percentage_of_Total_Events FROM MedMal85 GROUP BY Specialty;
补充说明
- Severity的tinyint类型不影响COUNT的结果,COUNT是统计非NULL的行数,和字段值无关;你之前转float的操作对COUNT没有意义,问题出在除法的类型上。
- 如果需要百分比格式(比如保留两位小数),可以用
FORMAT函数进一步处理:FORMAT(CAST(Total_Events AS FLOAT)/Total_Malpractice_Events, 'P2')
内容的提问来源于stack exchange,提问作者Desu235
相关产品推荐
相关产品推荐

