SQL查询如何固定Type列为Priority 1/2,无匹配统计值时显示0
SQL调整方案
核心思路是先生成包含两个固定优先级的基准行,再左关联你的统计结果,无匹配数据时自动补0,调整后代码如下:
SELECT t.Type, COALESCE(s.userh1, 0) AS userh1 FROM -- 构造固定优先级的基准行,确保两个取值一定会出现在结果中 (VALUES ('Priority 1'), ('Priority 2')) AS t(Type) LEFT JOIN ( SELECT CASE WHEN LEFT(DATA.LICLVS, 5) = '99999' THEN 'Priority 2' ELSE 'Priority 1' END AS Type, COUNT(DISTINCT LIVUID) as userh1 FROM DATA WHERE UPPER(LIVUID) <> 'ADMIN' AND TRIM(LIVUID) IS NOT NULL AND UPPER(LIVUID) <> 'ICMADMIN' AND UPPER(LIVUID) <> 'CONTINGENC' AND UPPER(LIVUID) <> 'INDEXUPDAT' -- 原SQL此处引用了LOCALDATA字段,若DATA是表别名请自行修正对应表名 AND DATA.LICRTD = '20211122' AND LIVUID <> '' -- 简化原时间判断逻辑,避免多次类型转换 AND VARCHAR_FORMAT(TIMESTAMP(CREATETS) + CURRENT TIMEZONE, 'HH24MI') BETWEEN '0900' AND '0929' GROUP BY CASE WHEN LEFT(DATA.LICLVS, 5) = '99999' THEN 'Priority 2' ELSE 'Priority 1' END ) AS s ON t.Type = s.Type
额外优化说明:
- 原查询WHERE条件已经限定了时间范围,因此删除了GROUP BY子句中冗余的时间分组条件
- 将原复杂的时分判断简化为直接判断HH24MI格式的字符串范围,逻辑更简洁,执行效率更高
内容的提问来源于stack exchange,提问作者hary
相关产品推荐
相关产品推荐

