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

如何将统计StatusID的SQL查询转换为CASE语句实现占比判断

问题描述

需要统计近12小时内类型为5033的任务中,StatusID=5的占比,当占比超过50%时返回'RED'(触发告警),否则返回'GREEN'。现有用于统计各StatusID计数的SQL如下:

select StatusID, count(statusid) as [count]
from job nolock 
where jobtypeid = 5033 
    and ModifiedOn > CONVERT(datetime,dateadd(hh,-12,getdate()),104)
group by statusid
order by 1 desc

需要将上述统计逻辑整合到CASE判断中,实现占比触发告警的逻辑。

解决方案

方案一:直接输出告警状态

无需先分组统计各StatusID数量,直接通过聚合计算占比后用CASE返回结果:

SELECT 
    CASE 
        WHEN SUM(CASE WHEN StatusID = 5 THEN 1 ELSE 0 END) * 1.0 / COUNT(*) > 0.5 
        THEN 'RED' 
        ELSE 'GREEN' 
    END AS AlertStatus
FROM job WITH(NOLOCK)
WHERE jobtypeid = 5033 
    AND ModifiedOn > DATEADD(hh, -12, GETDATE())

逻辑说明:

  • SUM(CASE WHEN StatusID = 5 THEN 1 ELSE 0 END):统计近12小时内StatusID=5的任务数量
  • COUNT(*):统计近12小时内符合条件的总任务数
  • 乘以1.0是为了避免整数除法,确保得到精确的小数占比
  • 通过CASE判断占比是否超过50%,返回对应的告警状态

方案二:保留分组统计同时输出告警状态

如果需要保留原分组统计结果,同时在StatusID=5的行中显示告警状态,可以用窗口函数计算总任务数:

SELECT 
    StatusID,
    COUNT(statusid) AS [count],
    CASE 
        WHEN COUNT(statusid) * 1.0 / SUM(COUNT(statusid)) OVER() > 0.5 AND StatusID = 5
        THEN 'RED'
        ELSE 'GREEN'
    END AS AlertStatus
FROM job WITH(NOLOCK)
WHERE jobtypeid = 5033 
    AND ModifiedOn > DATEADD(hh, -12, GETDATE())
GROUP BY StatusID
ORDER BY 1 DESC

这个版本会在每个StatusID的统计行中,当StatusID=5的占比超50%时,该行的AlertStatus显示'RED',其他情况显示'GREEN'。

内容的提问来源于stack exchange,提问作者Badja

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 17:30:33