求助:创建标记列,标记存在CLOSED空值的合同编号
解决合同编号标记Flag的SQL问题
嘿,这问题我熟!你想要的是按合同编号分组,只要该合同下有任意一行的CLOSED为空就标记1,对吧?你的原SQL语句出错是因为没处理好行级判断和分组聚合的关系,我来给你拆解一下:
你的原语句问题所在
原语句里的case when CLOSED is null then 1 else 0 end as flag是逐行生成标记,但你直接跟了group by CONTRACT_NUMBER,数据库会报错——因为分组后,你必须用聚合函数来把组内的多个行级结果合并成一个组级结果,数据库不知道该返回组里的哪一个flag值。
两种可行的解决方案
方案1:用聚合函数(最简洁通用)
利用MAX()函数来聚合组内的标记值:只要组内有一行是1(CLOSED为空),MAX()就会返回1;如果所有行都是0,就返回0。
SELECT CONTRACT_NUMBER, MAX(CASE WHEN CLOSED IS NULL THEN 1 ELSE 0 END) AS flag FROM your_table_name -- 替换成你的表名 GROUP BY CONTRACT_NUMBER;
方案2:用EXISTS子查询(可读性更强)
通过子查询直接检查当前合同是否存在CLOSED为空的行,逻辑更直观:
SELECT DISTINCT CONTRACT_NUMBER, CASE WHEN EXISTS ( SELECT 1 FROM your_table_name t2 WHERE t2.CONTRACT_NUMBER = t1.CONTRACT_NUMBER AND t2.CLOSED IS NULL ) THEN 1 ELSE 0 END AS flag FROM your_table_name t1; -- 替换成你的表名
两种方案都能实现你的需求,你可以根据自己的SQL习惯和表数据量选择——如果表很大,聚合函数的性能通常更好;如果逻辑需要扩展,子查询的可读性会更优。
内容的提问来源于stack exchange,提问作者JudgeDredd
相关产品推荐
相关产品推荐

