You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 08:52:41