postgres Group By 踩坑

1,065 阅读2分钟

本文已参与新文创作礼活动,一起开启掘金创作之路

postgres Group By 踩坑

坑点:使用postgres数据库group by分组报错!

must appear in the GROUP BY clause or be used in an aggregate function

1、首先把表结构和sql列出来看看

groupBy.png

SELECT *
FROM event
GROUP BY state;
结果是这样的:column "event.eno" must appear in the GROUP BY clause or be used in an aggregate function

到这里的时候我已经开始怀疑自己了,难道是我sql全忘了么?这个放在mysql我赌十包辣条不会有问题!那是怎么回事呢?

解决办法

报错内容提示为:对应字段必须在 GROUP BY 中出现或者被用于聚合函数。

这里在我的几次调试判断的过程里总结出的结论(狗头保命.png)
回头去看官方给的解释(这也是很多博客里说的):在SQL3(1999)标准之前,select 的字段必须也放在group by 的语句里(因为当如未 在group的相同字段出现不同值时,数据库引擎便不知道刚显示什么了,主要的数据库引擎都不允 许这样的操作即使mysql在5.7版本后也需要打开一个选项才能使用。

结论:当sql使用到的字段应当在Group BY 中列举出来,相关函数使用字段无需在Group BY 中列举出来。

这里就感觉很奇怪了, 如果全列出来就失去了分组的意义了。上述情况是因为'✳'表示的是该表下所有的字段,当我把'✳'改成"state", count(eno)等函数时是不会报这个问题的。根据我自己的需求将sql修改为如下:

SELECT "state" , "count"(eno) as numbel
FROM event
GROUP BY state;

groupBy2.png

//示例2
select a.age, count(1) as numble, a.total
from 
	(	select age, total 
		from table1 t cross join 
			(	select count(1) as total 
				from table1 ) as b
	) as a
group by a.age,a.total

show.png