count(distinct)统计结果与分组查询行数不一致问题咨询
问题分析与解决方案
差异原因
代码集1的逻辑偏差:
代码集1未按table1_PIDM分组,所有聚合函数均针对整个查询结果集计算:Count(distinct table1_PIDM)统计的是所有满足WHERE条件的唯一PIDM总数(1793),包含那些总工资和<=0的PIDM。Sum(table1_GRS)是所有行的工资总和,having Sum(...)>0仅判断这个总合是否大于0(显然成立),并未过滤单个PIDM的工资和。
因此代码集1返回的是全量符合WHERE条件的PIDM数,而非预期的“工资和大于0的PIDM数”。
代码集2的实际逻辑:
虽然代码集2未显式写GROUP BY table1_PIDM,但Argos依赖的数据库会隐式按非聚合列table1_PIDM分组:Sum(table1_GRS)计算的是每个PIDM的总工资和。having Sum(...)>0过滤掉了总工资和<=0的PIDM。distinct在这里是冗余的(分组后每个PIDM仅对应一行),最终返回的是工资和大于0的唯一PIDM数(1749)。
两者核心差异:代码集1未过滤工资和<=0的PIDM,代码集2通过隐式分组+having实现了过滤。
修正方案
修正代码集1(统计工资和大于0的PIDM数量)
先按PIDM分组过滤出符合条件的记录,再统计数量:
SELECT COUNT(*) AS "Count_unique_PIDMs_with_positive_wages" FROM ( SELECT table1_PIDM FROM table1 table1 JOIN table2 table2 ON table1_EARN_CODE = table2_CODE WHERE table1_YEAR = :PayYear AND table1_MONTH BETWEEN :QtrBeg AND :QtrEnd AND table1_EARN_CODE NOT IN ('list of data') AND table2_CASH_IND <> 'N' GROUP BY table1_PIDM HAVING SUM(table1_GRS) > 0 ) AS valid_pidms;
优化代码集2(显式分组,去掉冗余distinct)
将隐式分组改为显式GROUP BY,逻辑更清晰:
SELECT SUM(table1_GRS) AS "GrossWages", table1_PIDM AS "Pidm" FROM table1 table1 JOIN table2 table2 ON table1_EARN_CODE = table2_CODE WHERE table1_YEAR = :PayYear AND table1_MONTH BETWEEN :QtrBeg AND :QtrEnd AND table1_EARN_CODE NOT IN ('list of data') AND table2_CASH_IND <> 'N' GROUP BY table1_PIDM HAVING SUM(table1_GRS) > 0;
总结
- 1793与1749的差值对应44个PIDM,这些PIDM满足WHERE条件但总工资和<=0,被代码集2过滤但未被代码集1过滤。
- 若需代码集1返回与代码集2一致的数量,必须通过分组+子查询实现精准过滤。
- 代码集2应使用显式
GROUP BY避免依赖数据库的非标准隐式分组行为。
内容的提问来源于stack exchange,提问作者MsWalkrOfSky
相关产品推荐
相关产品推荐

