COUNT DISTINCT统计异常:每日唯一CNTR_NBR计数不符
问题:统计当日唯一CNTR_NBR数量的SQL结果不符合预期
需求为统计当日唯一的CNTR_NBR数量,执行以下SQL语句后返回结果不符合预期:
SELECT TO_CHAR(BEGIN_DATE, 'DD-MM-YYYY') "DATE" , TRAN_TYPE_DESC , MENU_OPTN_NAME , REASON_CODE , REF_FIELD_3 "RC_REF_1" , COUNT (DISTINCT CNTR_NBR) AS LPNS FROM WMS2018.BAP_PROD_TRKG_TRAN_VIEW WHERE MENU_OPTN_NAME = 'Receive and Sort DCV' AND TRUNC(BEGIN_DATE) = TRUNC(SYSDATE) GROUP BY BEGIN_DATE , TRAN_TYPE_DESC , MENU_OPTN_NAME , REASON_CODE , REF_FIELD_3 ORDER BY 1 ;
当前返回结果显示:同一日期下有多条记录,每条记录对应不同时间点的分组,LPNS列是各子分组内的唯一CNTR_NBR计数,而非当日整体或指定维度下的当日统计值。
问题原因
原SQL的GROUP BY子句使用了未截断的BEGIN_DATE(包含时分秒信息),即使是同一天的记录,只要时间戳不同就会被拆分为独立分组,导致统计结果碎片化,无法得到日维度的唯一CNTR_NBR数量。
修正方案
根据实际需求选择以下两种修正方式:
1. 仅统计当日整体唯一CNTR_NBR数量
若无需按其他维度分组,仅需当日总计数:
SELECT TO_CHAR(TRUNC(BEGIN_DATE), 'DD-MM-YYYY') "DATE", COUNT(DISTINCT CNTR_NBR) AS LPNS FROM WMS2018.BAP_PROD_TRKG_TRAN_VIEW WHERE MENU_OPTN_NAME = 'Receive and Sort DCV' AND TRUNC(BEGIN_DATE) = TRUNC(SYSDATE) GROUP BY TRUNC(BEGIN_DATE) ORDER BY 1;
2. 按指定维度+日维度统计
若需保留TRAN_TYPE_DESC等维度分组,同时按日统计各分组下的唯一CNTR_NBR数量:
SELECT TO_CHAR(TRUNC(BEGIN_DATE), 'DD-MM-YYYY') "DATE", TRAN_TYPE_DESC, MENU_OPTN_NAME, REASON_CODE, REF_FIELD_3 "RC_REF_1", COUNT(DISTINCT CNTR_NBR) AS LPNS FROM WMS2018.BAP_PROD_TRKG_TRAN_VIEW WHERE MENU_OPTN_NAME = 'Receive and Sort DCV' AND TRUNC(BEGIN_DATE) = TRUNC(SYSDATE) GROUP BY TRUNC(BEGIN_DATE), TRAN_TYPE_DESC, MENU_OPTN_NAME, REASON_CODE, REF_FIELD_3 ORDER BY 1;
修正后通过TRUNC(BEGIN_DATE)将日期字段截断至日维度,确保同一天的记录归为同一分组,可得到符合预期的统计结果。
内容的提问来源于stack exchange,提问作者MarkP
相关产品推荐
相关产品推荐

