+ -
当前位置:首页 → 问答吧 → oracle的SQL语句求助

oracle的SQL语句求助

时间:2011-11-04

来源:互联网

有一张表 有一个字段 里面的值出现的可能有A,B,C,D........Z

现在要写一个SQL语句求,整张表里那个字段出现次数最多的前5名

比如说 C出现100次 是最多的 那就排第一

Y出现99次 是第二多的 那就排第二

F出现90次 是第三多的 那就排第三

以此类推 要求前5项名

这个SQL怎么写呢?

紧急求助 谢谢

作者: crazymanonly   发布时间: 2011-11-04

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

作者: opps_zhou   发布时间: 2011-11-04

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

作者: opps_zhou   发布时间: 2011-11-04

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

作者: crazymanonly   发布时间: 2011-11-04

哦 好的

作者: crazymanonly   发布时间: 2011-11-04

字符串解析转行后进行统计

作者: java3344520   发布时间: 2011-11-04

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

作者: pubb1111   发布时间: 2011-11-04

引用 3 楼 crazymanonly 的回复:

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


试试这样
SQL code

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

作者: draftbeer   发布时间: 2011-11-04

引用楼主 crazymanonly 的回复:
这个SQL怎么写呢?

紧急求助 谢谢

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

作者: yixilan   发布时间: 2011-11-04

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

作者: xiaoyu871225   发布时间: 2011-11-04

不应该是sum()的,应该是求count
引用 8 楼 yixilan 的回复:
引用楼主 crazymanonly 的回复:
这个SQL怎么写呢?

紧急求助 谢谢

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

作者: xiaoyu871225   发布时间: 2011-11-04

引用 3 楼 crazymanonly 的回复:
前5名 怎么体现 是不是有个什么TOP5之类的 不知道加在哪啊?呵呵

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

作者: F546445693   发布时间: 2011-11-04

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

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


试试这样

SQL code


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

作者: xiaoyu871225   发布时间: 2011-11-04

他这个rownum必须嵌套在外面
如果不嵌套的话,这个group by的话只会对此5条记录进行分组、排序,而并非group by之后的前5名
引用 6 楼 pubb1111 的回复:
group by 和 rownum <= 5 搞定!
1楼和2楼已写很清楚了

作者: xiaoyu871225   发布时间: 2011-11-04

引用 12 楼 xiaoyu871225 的回复:

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

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

作者: draftbeer   发布时间: 2011-11-04

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

作者: pubb1111   发布时间: 2011-11-04

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

作者: programmerxiaocai   发布时间: 2011-11-04