一、方法

我的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统计中,常常需要统计某些字段的占比,这里记录一下。

原始数据如下:

sql server 怎么算百分比 sql百分比计算_sql server 怎么算百分比


当需要知道不同工作的职工的占比时,即统计job列各自占总数的百分比。

SELECT  JOB,COUNT( * ) COUNT_JOB,
  100 * round( COUNT( * ) / SUM( COUNT( * )) OVER (), 4 ) || '%' percent 
FROM
  EMP t
GROUP BY
JOB

即可获得如下结果:

sql server 怎么算百分比 sql百分比计算_sql_02


当需要对某些特定值统计时,如工资大于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

sql server 怎么算百分比 sql百分比计算_字段_03