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

前端之家收集整理的这篇文章主要介绍了我想用group by但是不想用到聚合函数,有办法吗?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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

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


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

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

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

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


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

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

查询出现过2次的user:
4 @H_403_21@
select user @H_403_21@
bbb @H_403_21@
by user @H_403_21@
(*)=2 @H_403_21@ @H_403_21@
@H_403_21@ @H_403_21@
这样是正确的,但是如果改为:
<span style= "color: #FF0000;" >*</span> @H_403_21@
(*)=2 @H_403_21@ @H_403_21@ @H_403_21@ @H_403_21@
就会报错了, NOTAGROUPBYEXPRESSION,就改了个小星号,为什么就错了呢?
@H_403_21@
@H_403_21@
对我有用[0] 引用| 举报| 管理 @H_403_21@ @H_403_21@ #10得分:0回复于: 2009-08-05 08:57:12 @H_403_21@
因为分组查询中,前面查询的字段除了用来分组的字段外,都必须用聚合函数,否则系统不知道该取同一组数据中的哪一个
因为你按user分组,所以前面的没有问题
改成*后,显示所有字段,那么就必须为除了user字段外的其他字段加上聚合函数
你没有,所以出错了
select*frombbbwhereuserin(
selectuser
frombbb
groupbyuser
havingcount(*)=2)
这样可以 @H_403_21@
@H_403_21@
对我有用[2] 引用| 举报| 管理 @H_403_21@ @H_403_21@
#11得分:0回复于: 2009-08-05 09:49:44 @H_403_21@
引用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 @H_403_21@
@H_403_21@
对我有用[0] 引用| 举报| 管理 @H_403_21@ @H_403_21@
#12得分:0回复于: 2009-08-05 09:56:35 @H_403_21@
引用3楼wildwave的回复:
按国家顺序显示的话加个sqlcodeselect*fromaaawhereprice>=3orderbycountry


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


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

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



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


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


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

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


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


没表达清楚..我是说你那句要写成分组函数,然后把price>avg(price)放到having后
或者就用子查询,我写的那句
会报错是因为你的语句是逐行查询的,条件后面的参数不能用到聚合函数 @H_403_21@
@H_403_21@
对我有用[0] 引用| 举报| 管理 @H_403_21@ @H_403_21@
#20得分:0回复于: 2009-08-05 11:39:14 @H_403_21@
引用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)

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


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

猜你在找的设计模式相关文章