如何按ORDER_CONTRACT_NUMBER分组,正确生成TYPE列?
问题分析
你当前的SQL错误在于同时按ORDER_CONTRACT_NUMBER和PRODUCT CLASS分组,这会导致每个分组内仅包含单个产品类别,COUNT(distinct "PRODUCT CLASS")的结果永远为1,因此所有TYPE都被判定为XX ONLY,完全不符合预期。
解决方案
需要先单独统计每个合同号对应的产品类别总数,再将统计结果与原表关联,以此判断每条记录的TYPE类型:
SELECT t."ORDER_CONTRACT_NUMBER", CASE WHEN s.class_count > 1 THEN 'MIXED TYPE ' || t."PRODUCT CLASS" WHEN s.class_count = 1 THEN t."PRODUCT CLASS" || ' ONLY' ELSE NULL END AS TYPE FROM "product_class_Sheet1" t LEFT JOIN ( -- 子查询:统计每个合同号下的不同产品类别数量 SELECT "ORDER_CONTRACT_NUMBER", COUNT(DISTINCT "PRODUCT CLASS") AS class_count FROM "product_class_Sheet1" GROUP BY "ORDER_CONTRACT_NUMBER" ) s ON t."ORDER_CONTRACT_NUMBER" = s."ORDER_CONTRACT_NUMBER"
逻辑说明
- 子查询
s先按ORDER_CONTRACT_NUMBER分组,计算每个合同号对应的唯一产品类别总数; - 将子查询结果与原表
t通过合同号关联,让原表的每一行都能获取到对应合同号的类别总数; - 用
CASE WHEN根据类别总数生成TYPE:- 总数>1时,标记为
MIXED TYPE + 产品类别; - 总数=1时,标记为
产品类别 + ONLY。
- 总数>1时,标记为
执行该SQL后,输出结果将完全匹配你的期望。
内容的提问来源于stack exchange,提问作者Rahul Bhat
相关产品推荐
相关产品推荐

