加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-14 02:10:24 所属栏目:百科 来源:网络整理
导读:我想用group by但是不想用到聚合函数,有办法吗? [问题点数:30分,结帖人winmenaruto] 不显示删除回复 显示所有回复 显示星级回复 显示得分回复 只显示楼主 收藏 关注 winmenaruto winmenaruto 本版等级: 结帖率:97.59% 楼主 发表于: 2009-08-04 16:33:

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

收藏
对我有用[0] 丢个板砖[0] 引用| 举报| 管理
回复次数:25
对我有用[0] 引用| 举报| 管理
对我有用[0] 引用| 举报| 管理
#3得分:0回复于: 2009-08-04 16:42:53
按国家顺序显示的话加个
SQL code
?
1
2
3
select *
from aaa
where price>=3 order by country
对我有用[0] 引用| 举报| 管理
winmenaruto
winmenaruto
本版等级:
对我有用[0] 引用| 举报| 管理
#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
本版等级:
对我有用[0] 引用| 举报| 管理
#7得分:0回复于: 2009-08-04 17:07:33
分组查询前面的字段要用聚合函数(用来分组的那个字段除外),还有条件基本上都是写在from后面的where子句里,少用having
对我有用[0] 引用| 举报| 管理
关注
inthirties
inthirties
本版等级:
对我有用[1] 引用| 举报| 管理
#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)
这样可以
对我有用[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
对我有用[0] 引用| 举报| 管理
#12得分:0回复于: 2009-08-05 09:56:35
引用3楼wildwave的回复:
按国家顺序显示的话加个SQLcodeselect*fromaaawhereprice>=3orderbycountry


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


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

那是排序,china会排在japan前面。不过我这里加orderby主要是让查询结果中同一国家的所有列放到一起
对我有用[1] 引用| 举报| 管理
#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)
报错了:为什么啊,感觉很简单啊



对我有用[0] 引用| 举报| 管理
#15得分:0回复于: 2009-08-05 11:01:18
报错如下:groupfunctionisnotallowedhere,是不是用了聚合函数一定要用groupby呢?
我是新手,谢谢帮助O(∩_∩)O
对我有用[0] 引用| 举报| 管理
#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)不行呢
对我有用[0] 引用| 举报| 管理
#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后
或者就用子查询,我写的那句
会报错是因为你的语句是逐行查询的,条件后面的参数不能用到聚合函数
对我有用[0] 引用| 举报| 管理
#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)

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


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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

相关内容
推荐文章
站长推荐
热点阅读