如何在单条SQL查询中同时获取重复合同数与总合同数
解决同一行展示两个统计值的问题
没问题,咱们可以通过将两个统计查询作为独立列的方式来实现你想要的格式,不用UNION ALL(它是用来合并结果行的,所以会导致结果在同一列展示)。这里有两种简洁的实现方案:
方案1:使用子查询直接生成两列
这种方式最直观,把两个统计逻辑分别放在SELECT的两个子查询里:
SELECT -- 计算出现至少一次重复的合同去重计数 ( SELECT COUNT(DISTINCT c.CONTRATO) FROM `table` c WHERE EXISTS ( SELECT 1 FROM `table` c2 WHERE c2.CONTRATO = c.CONTRATO GROUP BY c2.CONTRATO HAVING COUNT(*) > 1 ) ) AS at_least_one_count, -- 计算表中总合同数(包含重复记录) (SELECT COUNT(CONTRATO) FROM `table`) AS total_count;
方案2:用CTE一次性统计更高效
如果你想避免多次扫描表,可以扩展你的CTE,一次性计算所需的两个值:
WITH contrato_group AS ( SELECT CONTRATO as u_contract, COUNT(*) AS count FROM `table` GROUP BY CONTRATO ) SELECT -- 统计有重复的合同数量 COUNT(DISTINCT CASE WHEN count > 1 THEN u_contract END) AS at_least_one_count, -- 这里直接关联原表获取总合同数,若需统计不同合同总数可改为COUNT(u_contract) (SELECT COUNT(CONTRATO) FROM `table`) AS total_count FROM contrato_group;
关键说明
UNION ALL的作用是合并结果集的行,所以会把两个统计值分成两行同一列,这不符合你的需求;而上面的方法是把两个统计作为SELECT的两个独立列,自然会在同一行展示。- 如果你说的“总合同数”是指不同合同的总数(而非所有记录数),可以把第二个子查询改成
(SELECT COUNT(DISTINCT CONTRATO) FROMtable),根据实际业务调整即可。
内容的提问来源于stack exchange,提问作者yigitozmen
相关产品推荐
相关产品推荐

