请教SQL查询中HAVING子句内SUM条件的逻辑含义
关于SQL查询中HAVING子句的逻辑解释
先拆解这段逻辑的核心:SQL里布尔表达式会被隐式转换为数值,TRUE对应1,FALSE对应0,所以SUM()在这里是统计满足条件的记录数量。
1. a.total >= IFNULL(b.total, 0)的作用
- 这个查询里,
a是客户某一年的购买记录,b是该客户下一年的购买记录(通过b.year = a.year + 1关联)。 - 对于客户的最后一年记录:左连接找不到下一年的
b记录,b.total是NULL,IFNULL(b.total, 0)把它转成0。而购买总额a.total必然是正数,所以a.total >= 0肯定成立,这条记录会被计为1。 - 对于客户的非最后一年记录:如果当前年的购买额
a.total>= 下一年的b.total,说明这两年不满足严格递增,这条记录计为1;如果a.total < b.total(符合严格递增要求),则计为0。
2. 为什么要SUM(...) = 1
要满足「年度总购买额严格递增」,意味着这个客户所有非最后一年的记录,都必须满足当前年总额 < 下一年总额——也就是这些非最后一年的记录,在a.total >= IFNULL(b.total,0)的判断里都为假,贡献0。只有最后一年的记录会贡献1,所以总和刚好是1。
如果某个客户有任意一年不满足严格递增(比如某一年总额 >= 下一年),那这条非最后一年的记录会额外贡献1,总和就会大于1,这样的客户就会被HAVING条件过滤掉,正好符合我们筛选严格递增客户的需求。
比如客户33,假设他存在某一年不满足递增,那SUM的结果就会是1(最后一年)+1(不满足的年份)=2,会被排除;而客户11、22的所有非最后一年都满足递增,SUM结果就是1,会被选中。
内容的提问来源于stack exchange,提问作者Joker
相关产品推荐
相关产品推荐

