关注 winmenaruto winmenaruto 本版等级:
结帖率:97.59% 楼主 发表于: 2009-08-04 16:33:11
问题1: 我想用group by但是不想用到聚合函数,有办法吗?
具体问题如下:
有表aaa
FruitName Country Price
apple china 1
banana china 2
orange china 3
apple japan 2
cherry japan 5
要求:列出每个国家价格大于3的水果的信息
select *
from aaa
group by country
having price>=3
我这样写是不对的,因为用了group by,所以select后面必须用聚合函数,但我这里没必要这么用啊,怎么办?
问题2: 是不是having后面也要用聚合函数才行啊
问题3: 我这么写为什么也不对啊
select count(fruitname) as Mycount
from aaa
group by country
where price>=2
在PL/SQL下做的。
<iframe id="iframeu1636200_0" src="http://pos.baidu.com/ccwm?rdid=1636200&dc=2&exps=113010&di=u1636200&dri=0&dis=0&dai=2&ps=1486x372&dcb=BAIDU_SSP_define&dtm=HTML_POST&dvi=0.0&dci=-1&dpt=none&tsr=0&tpr=1471922841847&ti=%E6%88%91%E6%83%B3%E7%94%A8group%20by%E4%BD%86%E6%98%AF%E4%B8%8D%E6%83%B3%E7%94%A8%E5%88%B0%E8%81%9A%E5%90%88%E5%87%BD%E6%95%B0%EF%BC%8C%E6%9C%89%E5%8A%9E%E6%B3%95%E5%90%97%EF%BC%9F-CSDN%E8%AE%BA%E5%9D%9B-CSDN.NET-%E4%B8%AD%E5%9B%BD%E6%9C%80%E5%A4%A7%E7%9A%84IT%E6%8A%80%E6%9C%AF%E7%A4%BE%E5%8C%BA&ari=2&dbv=2&drs=3&pcs=1323x874&pss=1323x12877&cfv=0&cpl=4&chi=1&cce=true&cec=UTF-8&tlm=1471922841&rw=874&ltu=http%3A%2F%2Fbbs.csdn.net%2Ftopics%2F310196189&ltr=https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3DM37BrBIQ23wyFbjBL-h9DhoSZHz0K__f7ANx6Q114mEYFCF2z8_3tVsu5iEKCGRn%26wd%3D%26eqid%3Da91f332000075dbb0000000557bbc294&ecd=1&psr=1920x1080&par=1920x1040&pis=-1x-1&ccd=24&cja=false&cmi=6&col=zh-CN&cdo=-1&tcn=1471922842&qn=bd4d4712463245b9&tt=1471922841832.19.240.242" width="200" height="22" align="center,center" vspace="0" hspace="0" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" allowtransparency="true" style="box-sizing: content-box; border-width: 0px; border-style: initial; vertical-align: bottom; margin: 0px;"></iframe>
创投前沿技术分享会
<iframe id="iframeu1636204_0" src="http://pos.baidu.com/ccwm?rdid=1636204&dc=2&exps=113010&di=u1636204&dri=0&dis=0&dai=3&ps=1486x880&dcb=BAIDU_SSP_define&dtm=HTML_POST&dvi=0.0&dci=-1&dpt=none&tsr=0&tpr=1471922841847&ti=%E6%88%91%E6%83%B3%E7%94%A8group%20by%E4%BD%86%E6%98%AF%E4%B8%8D%E6%83%B3%E7%94%A8%E5%88%B0%E8%81%9A%E5%90%88%E5%87%BD%E6%95%B0%EF%BC%8C%E6%9C%89%E5%8A%9E%E6%B3%95%E5%90%97%EF%BC%9F-CSDN%E8%AE%BA%E5%9D%9B-CSDN.NET-%E4%B8%AD%E5%9B%BD%E6%9C%80%E5%A4%A7%E7%9A%84IT%E6%8A%80%E6%9C%AF%E7%A4%BE%E5%8C%BA&ari=2&dbv=2&drs=3&pcs=1323x874&pss=1323x12877&cfv=0&cpl=4&chi=1&cce=true&cec=UTF-8&tlm=1471922841&rw=874&ltu=http%3A%2F%2Fbbs.csdn.net%2Ftopics%2F310196189&ltr=https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3DM37BrBIQ23wyFbjBL-h9DhoSZHz0K__f7ANx6Q114mEYFCF2z8_3tVsu5iEKCGRn%26wd%3D%26eqid%3Da91f332000075dbb0000000557bbc294&ecd=1&psr=1920x1080&par=1920x1040&pis=-1x-1&ccd=24&cja=false&cmi=6&col=zh-CN&cdo=-1&tcn=1471922842&qn=52817f31456869fe&tt=1471922841832.20.248.249" width="200" height="22" align="center,center" vspace="0" hspace="0" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" allowtransparency="true" style="box-sizing: content-box; border-width: 0px; border-style: initial; vertical-align: bottom; margin: 0px;"></iframe>
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
回复次数:25 关注 wildwave 小灰狼W 本版等级:
更多勋章#1 得分:0 回复于: 2009-08-04 16:41:32
汗,按你要求根本不要分组了 select * from aaa where price>=3 不就行了吗
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
关注 shiyiwan shiyiwan 本版等级:
#2 得分:0 回复于: 2009-08-04 16:42:44
1.为什么不用 select * from aaa where price >= 4; 2.having一般和group by一起用 3.应该是: select country, count(price) from aaa where price >= 2 group by country;
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
关注 wildwave 小灰狼W 本版等级:
更多勋章#3 得分:0 回复于: 2009-08-04 16:42:53
按国家顺序显示的话加个
1
2
3
select
*
from
aaa
where
price>=3
order
by
country
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
关注 winmenaruto winmenaruto 本版等级:
#4 得分:0 回复于: 2009-08-04 16:48:54
引用 3 楼 wildwave 的回复: 按国家顺序显示的话加个SQL codeselect*from aaawhere price>=3orderby country 那我问题1这么问:
如果要查出 水果种类有两种以上的国家的信息,怎么写呢
select country
from aaa
group by country
having count(*)>=2
我是认为这么写,但是是错的,因为select后面没有用聚合函数。怎么整、?
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
关注 wildwave 小灰狼W 本版等级:
更多勋章#5 得分:0 回复于: 2009-08-04 17:04:45
引用 3 楼 wildwave 的回复: 按国家顺序显示的话加个SQL codeselect*from aaawhere price>=3orderby country 1
2
select
country
from
aaa
group
by
country
having
count
(fruitname)>1
如果你上题中要按国家分组,查出每个国家价格大于3的水果名
这么写
1
2
3
4
5
6
7
8
9
10
select
country,ltrim(
max
(fruitname),
','
) fruitname
from
(
select
country,sys_connect_by_path(fruitname,
','
) fruitname
from
(
select
a.*,row_number()over(partition
by
country
order
by
price) rn
from
aaa a
where
price>=3)
start
with
rn=1
connect
by
country=
prior
country
and
rn-1=
prior
rn)
group
by
country
COUNTRY FRUITNAME
china orange,banana
japan cherry
你还是先详细看看group by 和聚合函数那块的说明吧
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
关注 andyguan01_2 andyguan01_2 本版等级:
#6 得分:0 回复于: 2009-08-04 17:05:51
引用 4 楼 winmenaruto 的回复: 引用 3 楼 wildwave 的回复: 按国家顺序显示的话加个SQL codeselect*from aaawhere price>=3orderby country 那我问题1这么问: 如果要查出 水果种类有两种以上的国家的信息,怎么写呢 select country from aaa group by country having count(*)>=2 我是认为这么写,但是是错的,因为select后面没有用聚合函数。怎么整、? 你这个语句没有错啊,报什么错误信息?
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
关注 wildwave 小灰狼W 本版等级:
更多勋章#7 得分:0 回复于: 2009-08-04 17:07:33
分组查询前面的字段要用聚合函数(用来分组的那个字段除外),还有条件基本上都是写在from 后面的where子句里,少用having
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
关注 inthirties inthirties 本版等级:
#8 得分:0 回复于: 2009-08-04 17:36:50
引用 4 楼 winmenaruto 的回复: 引用 3 楼 wildwave 的回复: 按国家顺序显示的话加个SQL codeselect*from aaawhere price>=3orderby country 那我问题1这么问: 如果要查出 水果种类有两种以上的国家的信息,怎么写呢 select country from aaa group by country having count(*)>=2 我是认为这么写,但是是错的,因为select后面没有用聚合函数。怎么整、? 这句语法上应该没有错误,不过如果国家有重复水果的话。数据上是有问题的,
应该改为
select country
from aaa
group by country
having count(distinct(FruitName))>=2
对我有用[1] 丢个板砖[0] 引用 | 举报 | 管理
关注 winmenaruto winmenaruto 本版等级:
#9 得分:0 回复于: 2009-08-05 08:50:46
引用 8 楼 inthirties 的回复: 这句语法上应该没有错误,不过如果国家有重复水果的话。数据上是有问题的, 应该改为 select country from aaa group by country having count(distinct(FruitName))>=2 其实我之所以认为有错,是做了这个:
有表
表bbb:
id user num
1 a 3
2 a 4
3 b 5
4 b 7
查询出现过2次的user:
1
2
3
4
select
user
from
bbb
group
by
user
having
count
(*)=2
这样是正确的,但是如果改为:
1
2
3
4
select
<span style=
"color: #FF0000;"
>*</span>
from
bbb
group
by
user
having
count
(*)=2
就会报错了,
NOT A GROUP BY EXPRESSION ,就改了个小星号,为什么就错了呢?
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
关注 wildwave 小灰狼W 本版等级:
更多勋章#10 得分:0 回复于: 2009-08-05 08:57:12
因为分组查询中,前面查询的字段除了用来分组的字段外,都必须用聚合函数,否则系统不知道该取同一组数据中的哪一个 因为你按user 分组,所以前面的没有问题 改成* 后,显示所有字段,那么就必须为除了user 字段外的其他字段加上聚合函数 你没有,所以出错了 select* from bbb where user in( select user from bbb group by user having count(*)=2) 这样可以
对我有用[2] 丢个板砖[0] 引用 | 举报 | 管理
关注 winmenaruto winmenaruto 本版等级:
#11 得分:0 回复于: 2009-08-05 09:49:44
引用 10 楼 wildwave 的回复: 因为分组查询中,前面查询的字段除了用来分组的字段外,都必须用聚合函数,否则系统不知道该取同一组数据中的哪一个 因为你按user 分组,所以前面的没有问题 改成* 后,显示所有字段,那么就必须为除了user 字段外的其他字段加上聚合函数 你没有,所以出错了 select* from bbb where user in( select user from bbb group by user having count(*)=2) 这样可以 解释的非常清楚,高手!!谢谢
我的另一个帖子的9楼的提问能帮忙看看吗
http://topic.csdn.net/u/20090804/13/d31087c6-1f05-441b-991d-b598e7a7e98e.html?seed=416037155&r=58845215#r_58845215
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
关注 winmenaruto winmenaruto 本版等级:
#12 得分:0 回复于: 2009-08-05 09:56:35
引用 3 楼 wildwave 的回复: 按国家顺序显示的话加个SQL codeselect*from aaawhere price>=3orderby country 你这边不写orderby country 也是对的,不是很明白orderby的作用,这么一写是不是china的行排在japan的行前面??
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
关注 wildwave 小灰狼W 本版等级:
更多勋章#13 得分:0 回复于: 2009-08-05 10:17:41
引用 12 楼 winmenaruto 的回复: 引用 3 楼 wildwave 的回复: 按国家顺序显示的话加个SQL codeselect*from aaawhere price>=3orderby country 你这边不写orderby country 也是对的,不是很明白orderby的作用,这么一写是不是china的行排在japan的行前面?? 那是排序,china会排在japan前面。不过我这里加order by 主要是让查询结果中同一国家的所有列放到一起
对我有用[1] 丢个板砖[0] 引用 | 举报 | 管理
关注 winmenaruto winmenaruto 本版等级:
#14 得分:0 回复于: 2009-08-05 10:59:55
引用 13 楼 wildwave 的回复: 引用 12 楼 winmenaruto 的回复: 引用 3 楼 wildwave 的回复: 按国家顺序显示的话加个SQL codeselect*from aaawhere price>=3orderby country 你这边不写orderby country 也是对的,不是很明白orderby的作用,这么一写是不是china的行排在japan的行前面?? 那是排序,china会排在japan前面。不过我这里加order by 主要是让查询结果中同一国家的所有列放到一起 再问你隔:
apple china 1
banana china 2
orange china 3
apple japan 2
cherry japan 5
我想查出大于平均价格的所有记录,我这么写:
SELECT *
FROM aaa
where price>avg(price)
报错了:为什么啊,感觉很简单啊
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
关注 winmenaruto winmenaruto 本版等级:
#15 得分:0 回复于: 2009-08-05 11:01:18
报错如下:group function is not allowed here,是不是用了聚合函数一定要用group by呢? 我是新手 ,谢谢帮助O(∩_∩)O
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
关注 wildwave 小灰狼W 本版等级:
更多勋章#16 得分:0 回复于: 2009-08-05 11:09:31
引用 13 楼 wildwave 的回复: 引用 12 楼 winmenaruto 的回复: 引用 3 楼 wildwave 的回复: 按国家顺序显示的话加个SQL codeselect*from aaawhere price>=3orderby country 你这边不写orderby country 也是对的,不是很明白orderby的作用,这么一写是不是china的行排在japan的行前面?? 那是排序,china会排在japan前面。不过我这里加order by 主要是让查询结果中同一国家的所有列放到一起 因为avg()是聚合函数。你那一句是分组查询,还要把这个条件放到having后才不会报错
这个应该用子查询
1
select
*
from
aaa
where
price>(
select
avg
(price)
from
aaa)
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
关注 wildwave 小灰狼W 本版等级:
更多勋章#17 得分:0 回复于: 2009-08-05 11:16:26
如果分国家的话
1
2
select
*
from
aaa a
where
price>(
select
avg
(price)
from
aaa
where
country=a.country
group
by
country)
你买本讲解比较详细的书,先学习学习,然后做些练习
学起来会快一些
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
关注 winmenaruto winmenaruto 本版等级:
#18 得分:0 回复于: 2009-08-05 11:17:56
引用 16 楼 wildwave 的回复: 因为avg()是聚合函数。你那一句是分组查询 ,还要把这个条件放到having后才不会报错 这个应该用子查询 SQL codeselect*from aaawhere price>(selectavg(price)from aaa) 用了聚合函数,就是等于group by了吗?但是我没有写group by啊
这里为什么要用子查询啊 不懂啊,为什么直接 price>avg(price)不行呢
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
关注 wildwave 小灰狼W 本版等级:
更多勋章#19 得分:0 回复于: 2009-08-05 11:23:38
引用 18 楼 winmenaruto 的回复: 引用 16 楼 wildwave 的回复: 因为avg()是聚合函数。你那一句是分组查询,还要把这个条件放到having后才不会报错 这个应该用子查询 SQL codeselect*from aaawhere price>(selectavg(price)from aaa) 用了聚合函数,就是等于group by了吗?但是我没有写group by啊 这里为什么要用子查询啊 不懂啊,为什么直接 price>avg(price)不行呢 没表达清楚..我是说你那句要写成分组函数,然后把price>avg(price)放到having后
或者就用子查询,我写的那句
会报错是因为你的语句是逐行查询的,条件后面的参数不能用到聚合函数
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
关注 winmenaruto winmenaruto 本版等级:
#20 得分:0 回复于: 2009-08-05 11:39:14
引用 19 楼 wildwave 的回复: 引用 18 楼 winmenaruto 的回复: 引用 16 楼 wildwave 的回复: 因为avg()是聚合函数。你那一句是分组查询,还要把这个条件放到having后才不会报错 这个应该用子查询 SQL codeselect*from aaawhere price>(selectavg(price)from aaa) 用了聚合函数,就是等于group by了吗?但是我没有写group by啊 这里为什么要用子查询啊 不懂啊,为什么直接 price>avg(price)不行呢 没表达清楚..我是说你那句要写成分组函数,然后把price>avg(price)放到having后 或者就用子查询,我写的那句 会报错是因为你的语句是逐行查询的,条件后面的参数不能用到聚合函数 我这样写了:
select country
from aaa
group by country
having price>avg(price)
还是不对啊
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
关注 wildwave 小灰狼W 本版等级:
更多勋章#21 得分:30 回复于: 2009-08-05 11:42:43
- -! 你都用了分组了这么还用price作条件 将price换成max(price)试试
对我有用[1] 丢个板砖[0] 引用 | 举报 | 管理
关注 wildwave 小灰狼W 本版等级:
更多勋章#22 得分:0 回复于: 2009-08-05 11:43:20
是我上面没说清楚...
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
关注 winmenaruto winmenaruto 本版等级:
#23 得分:0 回复于: 2009-08-05 11:52:02
引用 21 楼 wildwave 的回复: - -! 你都用了分组了这么还用price作条件 将price换成max(price)试试 总结下:
也就是where后面不能用到聚合函数
having后面的表达式必须除了常量外 ,一定要为聚合函数
对吧
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
关注 wildwave 小灰狼W 本版等级:
更多勋章#24 得分:0 回复于: 2009-08-05 12:01:03
having后面的表达式里的参数不一定要用聚合函数,是分组查询结果中的字段也行 比如group by country ,那么having后也可以用country 这样很难讲清楚,你多看看相关方面的知识点,自己想想就知道了
对我有用[1] 丢个板砖[0] 引用 | 举报 | 管理
关注 albert386235433 albert386235433 本版等级:
#25 得分:0 回复于: 2011-08-04 08:48:58
10楼的说的很好