SQL使用中常见的误区与错误解析

column “xxx” must appear in the GROUP BY clause or be used in an aggregate function

字段xxx必须出现在group by的条件或者聚合函数中。

SELECT id,
	sum(labor_costs) as labor_costs, 
	sum(office_costs) as office_costs, 
	sum(execute_costs) as execute_costs, 
	collected_at 
FROM "expenses" 
	WHERE (collected_at >= 20240501 
	and collected_at <= 20240531) 
	AND "expenses"."deleted_at" = 0 
ORDER BY expenses.collected_at desc

在原sql语句中并未使用到group by但是为什么会出现了上述的错误呢?

原因:

上述使用了sum()聚合函数,聚合函数的操作结果是单行数据,但是在查询条件select中却包含了多项数据的项,idcollected_at 的查询结果是多项的,此时产生语义错误。此时必须使用group by实现对查询字段实现分组聚合, 对不同的字段分组聚合。

SELECT id,
	sum(labor_costs) as labor_costs, 
	sum(office_costs) as office_costs, 
	sum(execute_costs) as execute_costs, 
	collected_at 
FROM "expenses" 
	WHERE (collected_at >= 20240501 
	and collected_at <= 20240531) 
	AND "expenses"."deleted_at" = 0 
GROUP BY id,collected_at
ORDER BY expenses.collected_at desc
注意

在上述sql中,分组了两个字段idcollected_at ,这实际上也是有语义错误的,这样的分组比较迷糊,例如出现如下数据:

|id| collected_at | labor_costs | office_costs| execute_costs|
|1 | 2022-02-10   |    10       |     10	  |   10         |
|2 | 2022-02-11   |    10       |     10	  |   10         |
|3 | 2022-02-11   |    10       |     10	  |   10         |

如果项上面这样对id分组有三个值,对collected_at 分组有两个值,该语句的聚合函数就会失效。所以在多个条件选项的情况下确保多个选项对应且唯一

总结:
1. 不能Group By非标量基元类型的列,如不能Group By text,image或bit类型的列 2. Select指定的每一列都应该出现在Group By子句中,除非对这一列使用了聚合函数; 3. 不能Group By在表中不存在的列; 4. 进行分组前可以使用Where子句消除不满足条件的行; 5. 使用Group By子句返回的组没有特定的顺序,可以使用Order By子句指定次序。

你可能感兴趣的:(数据库,sql,数据库,java)