嵌套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
相关产品推荐
相关产品推荐

