我想用group by但是不想用到聚合函数,有办法吗?

我想用group by但是不想用到聚合函数,有办法吗?[问题点数:30分,结帖人winmenaruto]

收藏
#3得分:0回复于: 2009-08-04 16:42:53
按国家顺序显示的话加个
sql code
?
1
2
3
select *
from aaa
where price>=3 order by country
winmenaruto
winmenaruto
本版等级:
#5得分:0回复于: 2009-08-04 17:04:45
引用3楼wildwave的回复:
按国家顺序显示的话加个sqlcodeselect*fromaaawhereprice>=3orderbycountry


2
country aaa group country
having count (fruitname)>1


如果你上题中要按国家分组,查出每个国家价格大于3的水果名
这么写
3
4
5
6
7
8
9
10
country,ltrim( max (fruitname), ',' )fruitname from
( (
a.*,row_number()over(partition price)rn aaaa price>=3)
start with rn=1
connect country= prior country and rn-1= rn)
country
COUNTRY FRUITNAME
china orange,banana
japan cherry


你还是先详细看看groupby和聚合函数那块的说明吧
对我有用[0] 引用| 举报| 管理
关注
andyguan01_2
andyguan01_2
本版等级:
#7得分:0回复于: 2009-08-04 17:07:33
分组查询前面的字段要用聚合函数(用来分组的那个字段除外),还有条件基本上都是写在from后面的where子句里,少用having
关注
inthirties
inthirties
本版等级:
#9得分:0回复于: 2009-08-05 08:50:46
引用8楼inthirties的回复:
这句语法上应该没有错误,不过如果国家有重复水果的话。数据上是有问题的,

该改
selectcountry
fromaaa
groupbycountry
havingcount(distinct(FruitName))>=2


其实我之所以认为有错,是做了这个:

有表
表bbb:
idusernum
1a3
2a4
3b5
4b7

查询出现过2次的user:
4
select user
bbb
by user
(*)=2

这样是正确的,但是如果改为:
<span style= "color: #FF0000;" >*</span>
(*)=2

就会报错了, NOTAGROUPBYEXPRESSION,就改了个小星号,为什么就错了呢?
对我有用[0] 引用| 举报| 管理
#10得分:0回复于: 2009-08-05 08:57:12
因为分组查询中,前面查询的字段除了用来分组的字段外,都必须用聚合函数,否则系统不知道该取同一组数据中的哪一个
因为你按user分组,所以前面的没有问题
改成*后,显示所有字段,那么就必须为除了user字段外的其他字段加上聚合函数
你没有,所以出错了
select*frombbbwhereuserin(
selectuser
frombbb
groupbyuser
havingcount(*)=2)
这样可以
#11得分:0回复于: 2009-08-05 09:49:44
引用10楼wildwave的回复:
因为分组查询中,前面查询的字段除了用来分组的字段外,都必须用聚合函数,否则系统不知道该取同一组数据中的哪一个
因为你按user分组,所以前面的没有问题
改成*后,显示所有字段,那么就必须为除了user字段外的其他字段加上聚合函数
你没有,所以出错了
select*frombbbwhereuserin(
selectuser
frombbb
groupbyuser
havingcount(*)=2)
这样可以


解释的非常清楚,高手!!谢谢
我的另一个帖子的9楼的提问能帮忙看看吗
http://topic.csdn.net/u/20090804/13/d31087c6-1f05-441b-991d-b598e7a7e98e.html?seed=416037155&r=58845215#r_58845215
#12得分:0回复于: 2009-08-05 09:56:35
引用3楼wildwave的回复:
按国家顺序显示的话加个sqlcodeselect*fromaaawhereprice>=3orderbycountry


你这边不写orderbycountry也是对的,不是很明白orderby的作用,这么一写是不是china的行排在japan的行前面??
#13得分:0回复于: 2009-08-05 10:17:41
引用12楼winmenaruto的回复:
引用3楼wildwave的回复:
按国家顺序显示的话加个sqlcodeselect*fromaaawhereprice>=3orderbycountry


你这边不写orderbycountry也是对的,不是很明白orderby的作用,这么一写是不是china的行排在japan的行前面??

那是排序,china会排在japan前面。不过我这里加orderby主要是让查询结果中同一国家的所有列放到一起
#14得分:0回复于: 2009-08-05 10:59:55
引用13楼wildwave的回复:
引用12楼winmenaruto的回复:
引用3楼wildwave的回复:
按国家顺序显示的话加个sqlcodeselect*fromaaawhereprice>=3orderbycountry


你这边不写orderbycountry也是对的,不是很明白orderby的作用,这么一写是不是china的行排在japan的行前面??

那是排序,china会排在japan前面。不过我这里加orderby主要是让查询结果中同一国家的所有列放到一起


再问你隔:
apple china 1
banana china 2
orange china 3
apple japan 2
cherry japan 5

我想查出大于平均价格的所有记录,我这么写:
SELECT*
FROMaaa
whereprice>avg(price)
报错了:为什么啊,感觉很简单啊



#15得分:0回复于: 2009-08-05 11:01:18
报错如下:groupfunctionisnotallowedhere,是不是用了聚合函数一定要用groupby呢?
我是新手,谢谢帮助O(∩_∩)O
#16得分:0回复于: 2009-08-05 11:09:31
查询结果中同一国家的所有列放到一起


因为avg()是聚合函数。你那一句是分组查询,还要把这个条件放到having后才不会报错
这个应该用子查询
1
* price>( avg (price) aaa)
对我有用[0] 引用| 举报| 管理
#17得分:0回复于: 2009-08-05 11:16:26
如果分国家的话
price>(
country=a.country country)

你买本讲解比较详细的书,先学习学习,然后做些练习
学起来会快一些
对我有用[0] 引用| 举报| 管理
#18得分:0回复于: 2009-08-05 11:17:56
引用16楼wildwave的回复:
因为avg()是聚合函数你那一句是分组查询,还要把这个条件放到having后才不会报错
这个应该用子查询
sqlcodeselect*fromaaawhereprice>(selectavg(price)fromaaa)


用了聚合函数,就是等于groupby了吗?但是我没有写groupby啊
这里为什么要用子查询啊不懂啊,为什么直接price>avg(price)不行呢
#19得分:0回复于: 2009-08-05 11:23:38
引用18楼winmenaruto的回复:
引用16楼wildwave的回复:

因为avg()是聚合函数。你那一句是分组查询,还要把这个条件放到having后才不会报错
这个应该用子查询
sqlcodeselect*fromaaawhereprice>(selectavg(price)fromaaa)


用了聚合函数,就是等于groupby了吗?但是我没有写groupby啊
这里为什么要用子查询啊不懂啊,为什么直接price>avg(price)不行呢


没表达清楚..我是说你那句要写成分组函数,然后把price>avg(price)放到having后
或者就用子查询,我写的那句
会报错是因为你的语句是逐行查询的,条件后面的参数不能用到聚合函数
#20得分:0回复于: 2009-08-05 11:39:14
引用19楼wildwave的回复:
引用18楼winmenaruto的回复:
引用16楼wildwave的回复:

因为avg()是聚合函数。你那一句是分组查询,还要把这个条件放到having后才不会报错
这个应该用子查询
sqlcodeselect*fromaaawhereprice>(selectavg(price)fromaaa)


用了聚合函数,就是等于groupby了吗?但是我没有写groupby啊
这里为什么要用子查询啊不懂啊,为什么直接price>avg(price)不行呢


没表达清楚..我是说你那句要写成分组函数 ,然后把price>avg(price)放到having后或者就用子查询,我写的那句
会报错是因为你的语句是逐行查询的,条件后面的参数不能用到聚合函数

我这样写了:
selectcountry
fromaaa
groupbycountry
havingprice>avg(price)

还是不对啊
更多勋章
#22得分:0回复于: 2009-08-05 11:43:20
是我上面没说清楚...
#23得分:0回复于: 2009-08-05 11:52:02
引用21楼wildwave的回复:
--!
你都用了分组了这么还用price作条件
将price换成max(price)试试


总结下:
也就是where后面不能用到聚合函数
having后面的表达式必须除了常量外,一定要为聚合函数
对吧
#24得分:0回复于: 2009-08-05 12:01:03
having后面的表达式里的参数不一定要用聚合函数,是分组查询结果中的字段也行
比如groupbycountry,那么having后也可以用country
这样很难讲清楚,你多看看相关方面的知识点,自己想想就知道了
关注
albert386235433
albert386235433
本版等级:

相关文章

迭代器模式(Iterator)迭代器模式(Iterator)[Cursor]意图...
高性能IO模型浅析服务器端编程经常需要构造高性能的IO模型,...
策略模式(Strategy)策略模式(Strategy)[Policy]意图:定...
访问者模式(Visitor)访问者模式(Visitor)意图:表示一个...
命令模式(Command)命令模式(Command)[Action/Transactio...
生成器模式(Builder)生成器模式(Builder)意图:将一个对...