场景描述:
工作中拿到一个小需求,要求给智能推荐能力做一个简单的推荐量统计与推荐明细记录;
sql如下,使用了sum对表里的各种量进行了和计算
SELECT
SUM(tks.TOTAL_CLCK_QUT) allCount,
SUM(tks.MON_CLCK_QUT) monthCount,
SUM(tks.WEEK_CLCK_QUT) weekCount,
SUM(tks.DAILY_CLCK_QUT) dayCount
FROM t_kc_doc_edit_pus pus
JOIN t_kc_click_statis tks ON pus.KNWLG_ID = tks.KNWLG_ID
JOIN t_kc_catalog_doc_rel rel ON pus.KNWLG_ID = rel.KNWLG_ID
WHERE
pus.SRC_DEPARTMENT != '' AND pus.SRC_DEPARTMENT is not null
AND pus.KNWLG_STS_CD IN ('1P', '2P')
<if test="catalogId != null and catalogId != ''">
AND rel.CATL_ID = #{catalogId}
</if>
<if test="subCatalogId != null and subCatalogId != ''">
AND rel.CATL_ID = #{subCatalogId}
</if>
<if test="tenantId != null and tenantId !=''">
AND pus.TENANT_ID = #{tenantId}
</if>
页面图如下:
一切看着很正常;
问题:
当在页面切换筛选条件时,本该符合条件数据为0,结果页面数据无变化,要不是提前知道无符合条件的数据,差点都漏过去这个问题了,跟踪代码发现
List<Map> clickReadCount = tKcClickStatisMapper.getClickReadCount(readCountRequest);
clickReadCount的结果为 null,而不是空集合;
而原因就是sql中使用sum函数计算时,无数据时统计结果会为null而不是空,如下图:
解决办法:
这样去写,去null的情况做处理 IFNULL(SUM(tks.TOTAL_CLCK_QUT),0) allCount
在无数据时,统计结果会sql中处理为0