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

来源:互联网 发布:西安公路交通大学知乎 编辑:程序博客网 时间:2024/04/30 13:01

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

 收藏
楼主发表于: 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&amp;dc=2&amp;exps=113010&amp;di=u1636200&amp;dri=0&amp;dis=0&amp;dai=2&amp;ps=1486x372&amp;dcb=BAIDU_SSP_define&amp;dtm=HTML_POST&amp;dvi=0.0&amp;dci=-1&amp;dpt=none&amp;tsr=0&amp;tpr=1471922841847&amp;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&amp;ari=2&amp;dbv=2&amp;drs=3&amp;pcs=1323x874&amp;pss=1323x12877&amp;cfv=0&amp;cpl=4&amp;chi=1&amp;cce=true&amp;cec=UTF-8&amp;tlm=1471922841&amp;rw=874&amp;ltu=http%3A%2F%2Fbbs.csdn.net%2Ftopics%2F310196189&amp;ltr=https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3DM37BrBIQ23wyFbjBL-h9DhoSZHz0K__f7ANx6Q114mEYFCF2z8_3tVsu5iEKCGRn%26wd%3D%26eqid%3Da91f332000075dbb0000000557bbc294&amp;ecd=1&amp;psr=1920x1080&amp;par=1920x1040&amp;pis=-1x-1&amp;ccd=24&amp;cja=false&amp;cmi=6&amp;col=zh-CN&amp;cdo=-1&amp;tcn=1471922842&amp;qn=bd4d4712463245b9&amp;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&amp;dc=2&amp;exps=113010&amp;di=u1636204&amp;dri=0&amp;dis=0&amp;dai=3&amp;ps=1486x880&amp;dcb=BAIDU_SSP_define&amp;dtm=HTML_POST&amp;dvi=0.0&amp;dci=-1&amp;dpt=none&amp;tsr=0&amp;tpr=1471922841847&amp;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&amp;ari=2&amp;dbv=2&amp;drs=3&amp;pcs=1323x874&amp;pss=1323x12877&amp;cfv=0&amp;cpl=4&amp;chi=1&amp;cce=true&amp;cec=UTF-8&amp;tlm=1471922841&amp;rw=874&amp;ltu=http%3A%2F%2Fbbs.csdn.net%2Ftopics%2F310196189&amp;ltr=https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3DM37BrBIQ23wyFbjBL-h9DhoSZHz0K__f7ANx6Q114mEYFCF2z8_3tVsu5iEKCGRn%26wd%3D%26eqid%3Da91f332000075dbb0000000557bbc294&amp;ecd=1&amp;psr=1920x1080&amp;par=1920x1040&amp;pis=-1x-1&amp;ccd=24&amp;cja=false&amp;cmi=6&amp;col=zh-CN&amp;cdo=-1&amp;tcn=1471922842&amp;qn=52817f31456869fe&amp;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
    #1 得分:0回复于: 2009-08-04 16:41:32
    汗,按你要求根本不要分组了
    select * 
    from aaa 
    where price>=3
    不就行了吗
    对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
    #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] 引用 | 举报 | 管理
    #3 得分:0回复于: 2009-08-04 16:42:53
    按国家顺序显示的话加个
    SQL code
    ?
    1
    2
    3
    select 
    from aaa 
    where price>=3 order by country
    对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
    #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] 引用 | 举报 | 管理
    #5 得分:0回复于: 2009-08-04 17:04:45
    引用 3 楼 wildwave 的回复:
    按国家顺序显示的话加个SQL codeselect*from aaawhere price>=3orderby country


    SQL code
    ?
    1
    2
    select country from aaa group by country 
    having count(fruitname)>1


    如果你上题中要按国家分组,查出每个国家价格大于3的水果名
    这么写
    SQL code
    ?
    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] 引用 | 举报 | 管理
    #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] 引用 | 举报 | 管理
    #7 得分:0回复于: 2009-08-04 17:07:33
    分组查询前面的字段要用聚合函数(用来分组的那个字段除外),还有条件基本上都是写在from 后面的where子句里,少用having
    对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
    #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] 引用 | 举报 | 管理
    #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:
    SQL code
    ?
    1
    2
    3
    4
    select user
    from bbb
    group by user
    having count(*)=2

    这样是正确的,但是如果改为:
    SQL code
    ?
    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] 引用 | 举报 | 管理
    #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] 引用 | 举报 | 管理
    #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] 引用 | 举报 | 管理
    #12 得分:0回复于: 2009-08-05 09:56:35
    引用 3 楼 wildwave 的回复:
    按国家顺序显示的话加个SQL codeselect*from aaawhere price>=3orderby country


    你这边不写orderby country 也是对的,不是很明白orderby的作用,这么一写是不是china的行排在japan的行前面??
    对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
    #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] 引用 | 举报 | 管理
    #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] 引用 | 举报 | 管理
    #15 得分:0回复于: 2009-08-05 11:01:18
    报错如下:group function is not allowed here,是不是用了聚合函数一定要用group by呢?
    我是新手 ,谢谢帮助O(∩_∩)O
    对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
    #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后才不会报错
    这个应该用子查询
    SQL code
    ?
    1
    select from aaa where price>(select avg(price) from aaa)
    对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
    #17 得分:0回复于: 2009-08-05 11:16:26
    如果分国家的话
    SQL code
    ?
    1
    2
    select from aaa a where price>(
    select avg(price) from aaa where country=a.country group by country)

    你买本讲解比较详细的书,先学习学习,然后做些练习
    学起来会快一些
    对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
    #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] 引用 | 举报 | 管理
    #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] 引用 | 举报 | 管理
    #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] 引用 | 举报 | 管理
    #21 得分:30回复于: 2009-08-05 11:42:43
    - -!
    你都用了分组了这么还用price作条件
    将price换成max(price)试试
    对我有用[1] 丢个板砖[0] 引用 | 举报 | 管理
    #22 得分:0回复于: 2009-08-05 11:43:20
    是我上面没说清楚...
    对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
    #23 得分:0回复于: 2009-08-05 11:52:02
    引用 21 楼 wildwave 的回复:
    - -!
    你都用了分组了这么还用price作条件
    将price换成max(price)试试


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