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

求助:WebLog表含IF语句的交叉表查询异常问题

解决WebLog状态码按IP分组统计的SQL问题

嘿,我来帮你排查下这个SQL查询的问题~

你当前的语句里,每个SUM(IF(...))的写法有个关键问题:IF函数只定义了条件,但没指定满足条件时的返回值。比如SUM(IF(retcode<100,0)),不管retcode是否小于100,这个IF都会返回0,最后SUM出来的结果自然全是0,这显然不是你想要的效果。

正确的写法应该是:当条件满足时返回1(代表统计1条符合条件的记录),不满足时返回0,这样SUM就能累加出每个区间的数量了。修正后的完整语句如下:

SELECT 
    ipno,
    SUM(IF(retcode < 100, 1, 0)) AS '<100',
    SUM(IF(retcode >= 100 AND retcode < 200, 1, 0)) AS '100s',
    SUM(IF(retcode >= 200 AND retcode < 300, 1, 0)) AS '200s',
    SUM(IF(retcode >= 300 AND retcode < 400, 1, 0)) AS '300s',
    SUM(IF(retcode >= 400, 1, 0)) AS '400s'
FROM WebLog
GROUP BY ipno;

简单解释下:

  • 每个IF(条件, 1, 0)会对每条记录做判断,符合区间就记1条,否则记0
  • SUM函数会把每个IP对应的区间数值累加,得到该IP在各状态码区间的请求总数

如果你的数据库支持CASE WHEN,也可以用更清晰的写法(效果完全一样):

SELECT 
    ipno,
    SUM(CASE WHEN retcode < 100 THEN 1 ELSE 0 END) AS '<100',
    SUM(CASE WHEN retcode >= 100 AND retcode < 200 THEN 1 ELSE 0 END) AS '100s',
    SUM(CASE WHEN retcode >= 200 AND retcode < 300 THEN 1 ELSE 0 END) AS '200s',
    SUM(CASE WHEN retcode >= 300 AND retcode < 400 THEN 1 ELSE 0 END) AS '300s',
    SUM(CASE WHEN retcode >= 400 THEN 1 ELSE 0 END) AS '400s'
FROM WebLog
GROUP BY ipno;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:32:58