在选择列表中无效,因为该列既不包含在聚合函数中,也不包含在 GROUP BY 子句(

今天碰到这问题,从一个blog转来的,写的很好。归结一下,select中要查询的字段除了聚合函数中的项,其余的项都要包含在group by后面;group by在效果上也是与distinct一样的。

突然看到这个问题,脑袋一蒙,不知道啥意思,后来想想,试图把select里的选项放到后面,问题自然解决!
下面这个就是报“在选择列表中无效,因为该列既不包含在聚合函数中,也不包含在 GROUP BY 子句”问题语句
select shipcountry,sum(shipvia) as totalvia,OrderDate as thefirsttime from orders group by shipcountry
下面是通过的,请注意 orderdate
select shipcountry,OrderDate as thefirsttime from orders group by shipcountry,orderdate
相应的从网上看到其他的朋友也有这样的问题

比如要显示authors表中的au_fname,au_lname,zip,city,state信息,并且按city分组(相同city的排列在一起)

错误的表达:
select au_fname,state
from authors
group by city

就会出现:服务器: 消息 8120,级别 16,状态 1,行 1
列 'authors.au_fname' 在选择列表中无效,因为该列既不包含在聚合函数中,也不包含在 GROUP BY 子句中。
服务器: 消息 8120,级别 16,状态 1,行 1
列 'authors.au_lname' 在选择列表中无效,因为该列既不包含在聚合函数中,也不包含在 GROUP BY 子句中。
...... 的错误提示。

正确的表达:
select au_fname,state
from authors
group by city,au_fname,zip,state

即指定 GROUP BY 时,选择列表中任一非聚合表达式内的所有列都应包含在 GROUP BY 列表中,或者 GROUP BY 表达式必须与选择列表表达式完全匹配。

其实还有更好的办法:
select au_fname,state
from authors
order by city
即使用order by 子句

还是authors表,要求在每个城市取一个作者,显示该作者的左右信息:
可以用如下表达:
select * from authors
where au_id in
(select min(au_id)
from authors
group by city)
其实是分组后取最小ID的

比如要显示authors表中的au_fname,zip,state

即指定 GROUP BY 时,选择列表中任一非聚合表达式内的所有列都应包含在 GROUP BY 列表中,或者 GROUP BY 表达式必须与选择列表表达式完全匹配。

其实还有更好的办法:
select au_fname,state
from authors
order by city
即使用order by 子句

还是authors表,要求在每个城市取一个作者,显示该作者的左右信息:
可以用如下表达:
select * from authors
where au_id in
(select min(au_id)
from authors
group by city)
其实是分组后取最小ID的行

http://blog.sina.com.cn/s/blog_41399b8b01000997.html

相关文章

什么是设计模式一套被反复使用、多数人知晓的、经过分类编目...
单一职责原则定义(Single Responsibility Principle,SRP)...
动态代理和CGLib代理分不清吗,看看这篇文章,写的非常好,强...
适配器模式将一个类的接口转换成客户期望的另一个接口,使得...
策略模式定义了一系列算法族,并封装在类中,它们之间可以互...
设计模式讲的是如何编写可扩展、可维护、可读的高质量代码,...