有一张表 有一个字段 里面的值出现的可能有A,B,C,D........Z现在要写一个SQL语句求,整张表里那个字段出现次数最多的前5名比如说 C出现100次 是最多的 那就排第一Y出现99次 是第二多的 那就排第二F出现90次 是第三多的 那就排第三以此类推  要求前5项名这个SQL怎么写呢?紧急求助 谢谢

解决方案 »

  1.   

    select col1, count(*) from table_name group by col1 order by count(*) desc;
      

  2.   

    如果只要前 5 的话,加一个 where rownum <= 5 就可以
      

  3.   

    前5名 怎么体现 是不是有个什么TOP5之类的 不知道加在哪啊?呵呵
      

  4.   

    group by 和 rownum <= 5 搞定!
    1楼和2楼已写很清楚了
      

  5.   


    试试这样 SELECT  TOP 5 columnname,count(columnname) AS c FROM table_name 
    GROUP BY columnname
    ORDER BY c desc
      

  6.   

    select t1 , cnt from (
    select t1,sum(1) cnt from TABLE
    group by t1
    order by sum(1)
    ) t
    where rownum <= 5
      

  7.   

    select * from (select col1, count(*) cnt from table_name group by col1 order by count(*) desc) where rownum < 6;
      

  8.   

    不应该是sum()的,应该是求count
      

  9.   

    1+2楼的结果就是一张表,在对这张表进行TOP就可以了。简单的蠢方法。个人见解
      

  10.   

    你这个top是在SQL Server里用的吧。 oracle里没这个用法,oracle中可以用rownum来控制 top 5就相当于rownum <=5. 楼主可以自己尝试下rownum放里面和嵌套在外面的效果有什么区别,自己体会下。
    再说你这里不能直接order by c的   别名不能直接使用,要使用该别名需要再嵌套一层
      

  11.   

    他这个rownum必须嵌套在外面
    如果不嵌套的话,这个group by的话只会对此5条记录进行分组、排序,而并非group by之后的前5名
      

  12.   

    是的,oracle 里边没有这种用法。
      

  13.   

    top是在SQL Server里面使用的,ORACLE不是TOP,是用ROWNUM来判断的,ROWNUM是ORACLE自带的属性
      

  14.   

    select b.* from ( 
    select count(xx) ,rank() over(order by  count(xx) desc ) as rk from tab1 t group by t.xx) b
    where b.rk<=5