一、方法
我的sql语句本来就计算好了不同字段的记录数,只需要再统计一下占总记录数的百分比即可,也就是在select后加上这段代码:
100 * round( COUNT( * ) / SUM( COUNT( * )) OVER (), 4 ) || '%' percent
这个语句中用到的几个sql函数讲解:
1、ROUND() 函数 :
- 用于把数值字段舍入为指定的小数位数,即保留几位小数。
- round(a,b) a 表示要舍入的字段;b规定要返回的小数位数。
- 详细说明:SQL ROUND() 函数
2、COUNT() 函数
- 返回匹配指定条件的行数。
- COUNT(*) 函数返回表中的记录数。
- 详细说明:SQL COUNT() 函数
3、SUM() 函数
- SUM 函数返回该列数值的总和。
- 结合上面的COUNT() 函数说明,这里的 sum( count(*) ) 即为 count 这一列数值的总和,也就是总记录数。
- 详细说明:SQL SUM() 函数
4、OVER() 函数
- 以前使用聚合函数必须分组,即便没有group by 子句,也是默认将表中所有的数据分成了1组,来聚合。
- 通过使用over子句可以在不分组的情况下实现聚合运算,在查询结果集中既包含基础行的数据也包含聚合函数的值。(可以把over()子句理解成是“后台运行的数据”,只是为了 “用一下” 聚合函数或者是排名函数,并不影响实际显示的数据。在后台提供数据。)
- 当over()子句与聚合函数一起使用时,可以直接写count(*)over(),不在over()子句中进行任何分区,表示把整个表分为一个区
- 在这个句子中,如果去掉 OVER() 函数,会提示错误: ORA-00937: 不是单组分组函数
- 详细说明:
-sql语句关键字over的作用及用法
二、参考文章
参考文章内容:
在oracle统计中,常常需要统计某些字段的占比,这里记录一下。
原始数据如下:
当需要知道不同工作的职工的占比时,即统计job列各自占总数的百分比。
SELECT JOB,COUNT( * ) COUNT_JOB,
100 * round( COUNT( * ) / SUM( COUNT( * )) OVER (), 4 ) || '%' percent
FROM
EMP t
GROUP BY
JOB
即可获得如下结果:
当需要对某些特定值统计时,如工资大于2000的占比。
需要将特定值筛选出来然后与总数相除。这里就需要用到case when进行判别
SELECT (CASE
WHEN T.SAL > 2000 THEN
'工资大于2000'
WHEN T.SAL <= 2000 THEN
'工资不大于2000'
END) sal, COUNT(*), 100 * ROUND(COUNT(*) / SUM(COUNT(*)) OVER(), 4) || '%' PERCENT
FROM EMP T
GROUP BY CASE
WHEN T.SAL > 2000 THEN
'工资大于2000'
WHEN T.SAL <= 2000 THEN
'工资不大于2000'
END