问题:求特定列中的值占总和的百分比。例如,确定所有DEPTNO 10工资占总工资的百分比(DEPTNO 10的工资在总工资中的百分比数)。

解决方案

总的来说,在SQL中计算占总数的百分比跟书面计算一样:先除后乘。这个例子要计算表EMP中DEPTNO 10工资所占的百分比。首先,算出DEPTNO 10的工资,然后除以表中的工资总和,最后一步,乘以100,则返回一个表示百分比的值。

MySQL和PostgreSQL

DEPTNO 10的工资总和除以所有工资总和:

1 select (sum(

2           case when deptno = 10 then sal end)/sum(sal)

3          )*100 as pct

4    from emp

DB2、Oracle和SQL Server

使用内联视图及窗口函数SUM OVER,计算出所有工资总和以及DEPTNO 10的工资和。然后,在外层查询中进行除法和乘法操作:

1   select distinct (d10/total)*100 as pct

2     from (

3   select deptno,

4          sum(sal)over() total,

5          sum(sal)over(partition by deptno) d10

6     from emp

7          ) x

8    where deptno=10

讨论

MySQL和PostgreSQL

用CASE语句能够轻松地得到DEPTNO 10的工资。然后将它们加起来,并除以所有工资总和。由于聚集时会忽略NULL值,所以CASE语句中不必加入ELSE子句。如果想看到确切的被除数和除数,则可以执行不做除法的查询:

select sum(case when deptno = 10 then sal end) as d10,

sum(sal)

from emp

D10   SUM(SAL)

---- ---------

8750               29025

依定义SAL的方式不同,在进行除法操作时可能需要做显式类型转换。例如,在DB2、SQL Server和PostgreSQL中,如果SAL定义为整数,则可以把它转换为小数,以便得到正确答案,如下所示:

select (cast(

sum(case when deptno = 10 then sal end)

as decimal)/sum(sal)

)*100 as pct

from emp

DB2、Oracle和SQL Server

除传统解决方案外,该方案使用窗口函数计算相对于总数的百分数。对于DB2和SQL Server,如果SAL定义为整数类型,则在除法操作之前,需要进行类型转换:

select distinct

cast(d10 as decimal)/total*100 as pct

from (

select deptno,

sum(sal)over() total,

sum(sal)over(partition by deptno) d10

from emp

) x

where deptno=10

必须记住,窗口函数在WHERE子句后执行。因此不能把针对DEPTNO的筛选放在内联视图X中。分别考虑一下内联视图X中包含及不包含DEPTNO筛选的结果。首先,看一下不包含DEPTNO筛选的结果:

select deptno,

sum(sal)over() total,

sum(sal)over(partition by deptno) d10

from emp

DEP

------- --------- ---------

10      29025       8750

10      29025       8750

10      29025       8750

20      29025      10875

20      29025      10875

20      29025      10875

20      29025      10875

20      29025      10875

30      29025       9400

30      29025       9400

30      29025       9400

30      29025       9400

30      29025       9400

30      29025       9400

包含DEPTNO筛选的结果:

select deptno,

sum(sal)over() total,

sum(sal)over(partition by deptno) d10

from emp

where deptno=10

DEPTNO      TOTAL        D10

------ --------- ---------

10       8750       8750

10       8750       8750

10       8750       8750

由于窗口函数在WHERE子句后执行,因此TOTAL的值仅表示DEPTNO 10的工资之和,而实际上需要用TOTAL表示所有工资的总和。这就是必须把针对DEPTNO的筛选放在内联视图X外面的原因。

sql 累计占比_SQL语句-求总和的百分比相关推荐

  1. sql 累计占比_sql 面试题(难题汇总)

    除了sqlzoo的练习题外,为了加大练习强度,我还不断搜集一些其他的SQL题,特别是大小厂面试题的类型.我把比较难的题挑出来做了一个合集,才有了这篇文章.我会把题目和答案分开放,方便先自己练习,不懂再 ...

  2. sql 累计占比_sql统计占比和统计数量

    在工作中经常遇到统计占比的需求,有时候还要把没有值得统计为0,如何写sql呢? 下面写一个小例子,作为参考,方便以后查阅. 数据准备: create table t_group( id NUMBER ...

  3. sql 累计占比_sql中查询占百分比percent和通配符的使用

    标签: 第一.PERCENT w3cschool中不断的更新着新的知识点.有些感觉都没有这个概念,应该是几乎没有用在工作上的缘故吧如查询数据前面的一半: SELECT TOP 50 PERCENT * ...

  4. sql 累计占比_排名、占比、增长率怎么算,一个SQL语句搞定。(oracle 10g以上支持正则表达式)...

    Oracle分析函数使用总结 1.使用评级函数 评级函数(ranking function)用于计算等级.百分点.n分片等等,下面是几个常用到的评级函数: RANK():返回数据项在分组中的排名.特点 ...

  5. SQL求总和的百分比

    思路分析: 先通过group by得到每个分类别的总和,再通过开窗函数计算整体的总和,两者相除就得到占比了. 当over()后不加任何内容时,就是对所有的数据进行汇总. 1.使用over (parti ...

  6. sql 累计占比_SAS累积占比_累积比数模型

    最近用spss处理数据,但是spss缺乏变量内的计算.想算出一个累积占比还得靠SAS 首先 数据手动导入命名class; 然后 数据按某一列降序排列: proc sort data=class  ou ...

  7. mysql中sql命令大小写吗_sql语句大小写有关系吗?

    展开全部 SQL大小写并不敏感,bai但是如du果是引起来的字符,zhidao则是区分大小写的, 示例专如下, 1.创建测试属表,create table test_uporlow(id number ...

  8. sql 累计占比_制作有累积和占比的销售统计表

    现有这样的产品月销售明细表 希望按下面的样子,按类别分组统计各产品销售额,销售额从高到低排序,并增加组内累积及占比. 数据文件:产品销售明细.xls 制作报表过程 1. 打开润乾报表工具并新建空白报 ...

  9. server sql 数据总行数_sql统计行数的语句

    求一个sql统计行数的语句 col1  col2 ------------------- A1   2010xx A2   2010cx A1   2010ddd A2   2011dfsd A3   ...

最新文章

  1. java批量修改txt文件_Java小工具 根据文本批量修改文件名
  2. TCP面向连接的socket通信
  3. ceph-deploy install时,远端节点在执行apt-get update命令时失败
  4. 桩筏有限元中的弹性板计算_采用PKPM系列JCCAD软件桩筏筏板有限元方法计算的模型参数 -...
  5. 训练日志 2018.9.8
  6. Android什么时候用抽象类什么时候用接口
  7. 可以看游资的app_大大游资软件下载
  8. Ubuntu带给我们的商机
  9. windows server winrm介绍
  10. Linuxmint 19双显卡切换的巨坑
  11. padavan手动安装php
  12. linux安装Android Studio
  13. mysql查询各专业人数_查询各专业的学生数。
  14. POE交换机怎么开启poe功能
  15. unity移动端材质丢失呈洋红色问题记录
  16. 企业招聘网络推广运营人员的岗位工作职责该如何写?
  17. SQL语法笔记和常用技巧收集
  18. 分类模型指标ks的含义
  19. Headlike设计模式幕布笔记
  20. 本博客搜索,因为csdn的搜索功能不好使,所以使用google做个搜索

热门文章

  1. Shiro(4)整合SpringBoot2.x
  2. 竞价推广方案怎么写,这些点你get到了吗?
  3. 说说IO(七)- RAID
  4. python海伦公式计算三角形面积
  5. GDG深圳站,我又来了~
  6. Java并发编程—并发和并行、线程上下文
  7. 如你所愿!一款高效率的学习神器,打开就是永久会员SVIP权限!
  8. 单片机进阶---HLK-W801硬件开发之制作PCB
  9. 浅谈单片机、ARM和DSP的异同——非常透彻
  10. git push错误(fatal: The upstream branch of your current branch does not match)解决方案