SQL CASE语句多值判断问题:识别同一列中的Pre/Post及双订单
问题分析
你的查询存在两个核心问题:
- CASE逻辑错误:单条记录的
Order_ID不可能同时属于PreOrder和PostOrder的编号集合,所以第三个WHEN条件永远不会触发。 - GROUP BY用法违规:你按
Cust_ID分组,但SELECT中直接引用了未聚合的Order_ID,这不符合SQL的分组规则,会导致结果混乱。
解决方案
要实现需求,需要先统计每个客户是否同时拥有Pre和Post类型的订单,再根据统计结果返回对应标签。具体SQL如下:
SELECT Cust.Cust_ID, CASE WHEN has_pre = 1 AND has_post = 1 THEN 'BothOrders' WHEN has_pre = 1 THEN 'Pre' WHEN has_post = 1 THEN 'Post' ELSE NULL -- 无匹配订单时返回NULL,可根据需求调整 END AS Orders FROM ( SELECT Cust_ID, -- 标记是否存在PreOrder订单 MAX(CASE WHEN Order_ID IN ('154','3042000103','3042000099') THEN 1 ELSE 0 END) AS has_pre, -- 标记是否存在PostOrder订单 MAX(CASE WHEN Order_ID IN ('30400010112','3042000104') THEN 1 ELSE 0 END) AS has_post FROM Customer GROUP BY Cust_ID ) AS cust_order_summary
代码说明
- 子查询
cust_order_summary:对每个客户分组,用MAX()聚合函数判断该客户是否存在Pre/Post类型的订单(只要有一条匹配,就返回1)。 - 外层CASE:根据子查询的标记组合返回结果,优先判断同时拥有两种订单的情况,避免被单一类型的条件覆盖。
内容的提问来源于stack exchange,提问作者Elle
相关产品推荐
相关产品推荐

