关于含聚合函数的CASE WHEN查询的技术咨询
CASE WHEN 结合聚合函数的常见疑问解答
1. 该场景中聚合函数的作用是什么?
你给出的SQL里用了MAX()聚合函数,它的核心作用是判断整列是否所有值都是NULL。因为MAX()函数会自动忽略NULL值:如果某一列里存在至少一个非NULL值,MAX(col)会返回该列的最大值(非NULL);只有当整列所有行都是NULL时,MAX(col)才会返回NULL。
这段SQL就是利用这个特性,检查每一列是否全为空,把全空的列名筛选出来。
2. 两种写法的核心区别
(1)CASE WHEN MAX(...) ...:先聚合,后判断
这种写法是先对整列执行聚合计算(比如MAX(customer_id)),得到一个单一的聚合结果,再用CASE语句判断这个结果是否符合条件,最终返回一个单一值(一行数据)。
就像你给出的SQL,每个子查询都只返回一行:如果MAX(customer_id)是NULL,就返回列名customer_id,否则返回NULL,通过UNION ALL把所有列的检查结果拼起来,最后过滤出非NULL的列名。
(2)MAX(CASE WHEN ...):先判断,后聚合
这种写法是先对每一行执行CASE条件判断,每行都会得到一个判断结果(符合条件返回指定值,不符合返回NULL),再对所有行的判断结果执行聚合计算(比如MAX)。
这种用法常用于行转列、按条件统计场景,比如:要统计每个用户的最大实物订单金额,就可以写MAX(CASE WHEN order_type='实物' THEN order_amount ELSE NULL END),它会先筛选出每个用户的实物订单金额,再取最大值。
内容的提问来源于stack exchange,提问作者MASTER
相关产品推荐
相关产品推荐

