日期:2014-05-17  浏览次数:20570 次

关于分组查询,书上如是说:~~~~~~~~~~~~~~
书上说:“如果SELECT  后面是字段名列表,而这些字段名又不在聚合函数中,则应当在GROUP BY子句中列出所有这些字段名”

瞅这意思是如果select后面的字段名在聚合函数中,那么在group by子句中可以省略这些字段名。
那为什么:
输入如下代码(代码无误):
select programtime,MIN(programtime) from programinfo
group by programtype

显然,select 后面的字段programtime明明包含在了聚合函数MIN中了,为什么还出如下错误:
“选择列表中的列 'programinfo.programtime' 无效,因为该列没有包含在聚合函数或 GROUP BY 子句中”

------解决方案--------------------
引用:
Quote: 引用:

其实更准确的说,这个字段本身如果不在group by中,那么这个字段只能 在聚合函数中

书上说的,不够准确把。

显然上面的例子,programtime没有在group by,那么只能在min函数中:MIN(programtime) 

就是呀,我把programtime放在了min函数中了,为什么还是错误?


你这么写肯定会报错的,书上的话写的不够准确。

应该是,如果一列不在group by,那么这一列只能在聚合函数中,而你的programtime列,不在group by中,虽然在聚合函数中,但是:

select programtime,MIN(programtime) from programinfo
group by programtype

紫色的在聚合函数中,而红色的还是不在聚合函数中啊,所以就报错了
------解决方案--------------------
对于没被聚合函数处理的字段, group by 中有的  select后面必须有 
比如 select a,b,c from T group by a,b,c

至于在聚合函数中的字段,group by 中是不用包含的
比如 select a,b,c,min(d),max(e) from T group by a,b,c