SQL分组直方图报错:select子句非聚合或未在GROUP BY中
SQL分组统计问题:按包裹类型拆分重量区间统计
我是SQL新手,运行代码时碰到错误:select clause is neither an aggregate nor in the group by clause。我有一张pkg_data表,包含pkg_type(颜色分类)、pkg_weight字段,想用CASE语句按重量给包裹分类,统计每个区间的包裹数量。不加GROUP BY时代码能运行,但会合并所有pkg_type的统计结果,我需要按pkg_type拆分生成多组直方图。
原代码如下:
with pkg_size as ( select pkg_type, date, pkg_weight, case when pkg_weight >= 0.5 AND pkg_weight < 0.5 then 'small' when pkg_weight >= 1 AND pkg_weight < 2 then 'medium' when pkg_weight >= 2 AND pkg_weight < 3 then 'large' else 'out of range' end as pkg_size_histo from pkg_data where date > x1 and date <= y and pkg_size_hist is not null --group by pkg_type -- 报错: select clause is neither an aggregate nor in the group by clause order by date ) select pkg_size_hist, count(pkg_size_hist ) from pkg_size group by pkg_size_hist ;
当前输出是合并后的直方图,我希望按pkg_type拆分统计,自己找到临时修复方案,想获得更优编程建议:
临时修复代码:
select pkg_type,pkg_size_hist, count(pkg_size_hist ) from pkg_size group by pkg_type, pkg_size_hist ;
优化建议
- 修正CASE区间逻辑:原CASE第一个条件
pkg_weight >= 0.5 AND pkg_weight < 0.5永远不成立,会导致所有小重量包裹被归为out of range,建议调整为合理区间,比如pkg_weight >= 0 AND pkg_weight < 0.5 then 'small',同时补全原代码遗漏的区间(比如0.5到1的重量范围)。 - 精简CTE字段:CTE中
date和pkg_weight字段在最终统计中用不到,可以只保留pkg_type和pkg_size_histo,减少不必要的数据处理。 - 合并逻辑,简化代码:如果不需要复用CTE结果,可直接把CASE逻辑嵌入主查询,让代码更紧凑。
- 修正过滤条件:原代码中
and pkg_size_hist is not null是笔误,该字段是CASE生成的临时字段,原表不存在,应改为and pkg_weight is not null,避免统计空重量数据。
优化后示例代码:
select pkg_type, case when pkg_weight >= 0 AND pkg_weight < 0.5 then 'small' when pkg_weight >= 0.5 AND pkg_weight < 1 then 'small_plus' -- 补全原代码遗漏的区间 when pkg_weight >= 1 AND pkg_weight < 2 then 'medium' when pkg_weight >= 2 AND pkg_weight < 3 then 'large' else 'out of range' end as pkg_size_histo, count(*) as package_count from pkg_data where date > x1 and date <= y and pkg_weight is not null group by pkg_type, pkg_size_histo order by pkg_type, pkg_size_histo;
内容的提问来源于stack exchange,提问作者Bensa
相关产品推荐
相关产品推荐

