概述
在做数据统计的时候,经常会用到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')