本文已参与新文创作礼活动,一起开启掘金创作之路
postgres Group By 踩坑
坑点:使用postgres数据库group by分组报错!
must appear in the GROUP BY clause or be used in an aggregate function
1、首先把表结构和sql列出来看看
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;
//示例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