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

嵌套CASE语句返回错误结果,SQL统计逻辑问题排查求助

SQL统计符合条件订单次数的问题排查

问题描述

需要统计客户在2021-2022期间、出版物名称不含yyy(PublicationIntName NOT LIKE '%yyy%')且订单状态为完成(AdStatusName LIKE 'xxx')的订单次数,将结果插入到table1中。但当前使用嵌套CASE WHEN+COUNT的SQL返回了所有行数,不符合预期。

原SQL代码:

Insert into table 1 (Cust_ID, freq)
Select Cust_ID, COUNT(
CASE WHEN  PublicationIntName NOT LIKE '%yyy%' then
        case when Created Between '01.01.2021' and '31.12.2022' then
            case when AdStatusName like 'xxx' then 1 else 0 END
        else 0 end
else 0 end)
FROM table 2
Group by table 2. Cust_ID;

问题原因

COUNT()函数的特性是统计所有非NULL的行值,你的嵌套CASE语句无论条件是否满足,都会返回1或0(都是非NULL值),因此COUNT会把所有行都计入统计,最终得到的是每个客户的总订单数,而非符合条件的订单数。

修正方案

方案1:调整CASE返回值,用COUNT统计有效行

将不符合条件的分支返回NULL,这样COUNT会自动忽略这些行,只统计符合条件的次数:

Insert into table1 (Cust_ID, freq)
Select Cust_ID, COUNT(
    CASE 
        WHEN PublicationIntName NOT LIKE '%yyy%' 
             AND Created BETWEEN '2021-01-01' AND '2022-12-31' 
             AND AdStatusName LIKE 'xxx' 
        THEN 1 
        ELSE NULL 
    END) AS freq
FROM table2
GROUP BY Cust_ID;

方案2:改用SUM函数统计符合条件的次数

SUM()会直接对1和0求和,符合条件的行加1,不符合的加0,结果就是正确的订单次数,写法更简洁:

Insert into table1 (Cust_ID, freq)
Select Cust_ID, SUM(
    CASE 
        WHEN PublicationIntName NOT LIKE '%yyy%' 
             AND Created BETWEEN '2021-01-01' AND '2022-12-31' 
             AND AdStatusName LIKE 'xxx' 
        THEN 1 
        ELSE 0 
    END) AS freq
FROM table2
GROUP BY Cust_ID;

额外注意事项

  • 日期格式建议使用标准的YYYY-MM-DD格式(如'2021-01-01'),避免不同数据库对'01.01.2021'这类格式解析出错。
  • 表名和列名尽量不要加空格(比如table 1改为table1),避免语法问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 17:02:54