如何编写SQL查询按不同产品返回多维度计数结果
修正后的SQL查询(按产品统计多维度数量)
原查询的核心问题
- COUNT函数的条件逻辑写法错误,不符合SQL语法规范
- 表别名引用混乱(原查询中的
c未定义) - GROUP BY包含多余字段,导致分组维度错误
- NULL值的判断方式错误(IN无法匹配NULL)
- 多余的SELECT DISTINCT(GROUP BY已实现分组去重)
修正后的SQL语句
SELECT t1.product AS Type, COUNT(DISTINCT t3.id) AS [Total Count], COUNT(DISTINCT CASE WHEN t3.qDate >= '2023-06-06 00:00:00.0000000' THEN t3.id END) AS [Count < One Year], COUNT(DISTINCT CASE WHEN t3.qDate >= '2022-06-06 00:00:00.0000000' THEN t3.id END) AS [Count < Two Year] FROM [table1] t1 JOIN [table2] t2 ON t1.ID = t2.ID JOIN [table3] t3 ON t2.mb = t3.mb WHERE status = 'P' OR status IS NULL GROUP BY t1.Product ORDER BY t1.Product
关键修正说明
- COUNT条件逻辑:用
CASE WHEN筛选符合日期条件的记录,仅当条件满足时返回t3.id,COUNT会自动忽略NULL值,从而得到符合条件的去重数量。 - 表别名统一:将原查询中未定义的
c替换为实际表别名t3(若qDate和id来自其他表,可根据实际结构调整别名)。 - GROUP BY调整:仅保留
t1.Product作为分组字段,确保按产品维度汇总数据。 - NULL值判断:将
status IN ('P', NULL)改为status = 'P' OR status IS NULL,正确匹配NULL状态的记录。 - 移除多余DISTINCT:GROUP BY已经完成分组,SELECT DISTINCT属于冗余操作,直接删除。
预期输出
Type Total Count Count < One Year Count < Two Year ---------------------------------------------------------------- Van 10000 3000 7000 Car 50000 30000 70000 Truck 5000 200 500
内容的提问来源于stack exchange,提问作者John O
相关产品推荐
相关产品推荐

