SQL Server 2017按年月统计PUNCTUAL结果占比技术问询
解决方案:按年月计算PUNCTUAL结果占比
没问题,我来帮你搞定这个SQL计算。你的需求核心是按Year和Month分组,统计Result为PUNCTUAL的记录占分组总记录的百分比,下面是适配SQL Server 2017的完整解决方案:
最终SQL语句
SELECT Year, Month, CONCAT( ROUND( (SUM(CASE WHEN Result = 'PUNCTUAL' THEN 1 ELSE 0 END) * 100.0) / COUNT(*), 1 ), '%' ) AS Success FROM YourTable -- 替换成你的实际表名 GROUP BY Year, Month ORDER BY Year, Month;
关键逻辑解释
我拆解一下这段代码的核心部分,帮你理解为什么这么写:
SUM(CASE WHEN Result = 'PUNCTUAL' THEN 1 ELSE 0 END):统计每组中Result等于PUNCTUAL的记录数。用SUM比COUNT更直观——符合条件的记录返回1,不符合返回0,求和后就是目标记录的总数。COUNT(*):统计当前分组的总记录数,确保分母是分组内的所有数据。* 100.0:这里用100.0而不是100是为了触发浮点运算,避免SQL Server的整数除法问题(比如5/6如果用整数计算会得到0,乘以100.0后会得到正确的83.333...)。ROUND(..., 1):把计算结果保留1位小数,和你例子中的83.3%格式匹配。如果需要更多或更少小数,调整第二个参数即可。CONCAT(..., '%'):把计算出的数值和百分号拼接,直接得到你想要的XX.X%格式。
可选优化:处理空分组或总记录数为0的情况
如果你的数据中存在某年月没有记录,或者分组总记录数为0的情况,可以用NULLIF避免除以0错误,同时用ISNULL把结果转为0%:
SELECT Year, Month, CONCAT( ROUND( ISNULL( (SUM(CASE WHEN Result = 'PUNCTUAL' THEN 1 ELSE 0 END) * 100.0) / NULLIF(COUNT(*), 0), 0 ), 1 ), '%' ) AS Success FROM YourTable GROUP BY Year, Month ORDER BY Year, Month;
内容的提问来源于stack exchange,提问作者operamaxi
相关产品推荐
相关产品推荐

