对group by多字段查询进行一个探究及group by不是表达式解决方案

it2023-09-20  107

概述

在做数据统计的时候,经常会用到group by,有时候,还会涉及到对满足条件的多个字段进行分组,在多个字段分组的时候,它是怎么分的呐?我们做个探究

demo

来看数据

那么,我按两个字段查询,如果,第一个不同,是按第二个查呐?

如果第一个不同,按第二个查的话,那么大米和魅族应该是一组,那么计数的时候,应该为2

以group by id,deleted为例

SELECT MAX(id), COUNT(*) FROM `tb_brand` WHERE id BETWEEN 1 AND 9 GROUP BY id,deleted

我们来看结果, 大米和魅族并没有归为一组,也就是说,应该是没有同时满足条件,所以各是一组。

那么也就是说,在多字段分组的时候,同时满足两个条件的会归为一组对吗?

我们来测一下,

以group by first_char,deleted为例

如果满足条件归为一组,那么大米和魅族应该归为一组,计数时,应该为2

来看

SELECT MAX(id), COUNT(*) FROM `tb_brand` WHERE id BETWEEN 1 AND 9 GROUP BY first_char,deleted

id为8,是魅族的id,COUNT计数为2,也就证明了,group by当有多个字段时,同时满足,多个字段才会归为一组

为何只有一条呐?

group by不是表达式解决方案

因为group by是将符合条件的数据并为一组,一组里只显示一条数据,所以,通常来说,group by是要配合聚合函数一起使用的

select出来的字段都要写到group by中,如果,没写进去的话就会报不是group by表达式错误。可以加个max化解。

比如

如果用了MAX函数,而MAX中的值要写在GROUP BY中,需要用AS取别名,否则会报group by 表达式错误,TO_CHAR(CREATE_TIME,‘yyyy-MM-dd’)要取别名 CREATE_TIME,否则会报group by 表达式错误

SELECT TO_CHAR(CREATE_TIME,'yyyy-MM-dd') AS CREATE_TIME WHERE 1=1 GROUP BY TO_CHAR(CREATE_TIME,'yyyy-MM-dd')
最新回复(0)