sql 累计占比_SQL语句-求总和的百分比
问题:求特定列中的值占总和的百分比。例如,确定所有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语句-求总和的百分比相关推荐
- sql 累计占比_sql 面试题(难题汇总)
除了sqlzoo的练习题外,为了加大练习强度,我还不断搜集一些其他的SQL题,特别是大小厂面试题的类型.我把比较难的题挑出来做了一个合集,才有了这篇文章.我会把题目和答案分开放,方便先自己练习,不懂再 ...
- sql 累计占比_sql统计占比和统计数量
在工作中经常遇到统计占比的需求,有时候还要把没有值得统计为0,如何写sql呢? 下面写一个小例子,作为参考,方便以后查阅. 数据准备: create table t_group( id NUMBER ...
- sql 累计占比_sql中查询占百分比percent和通配符的使用
标签: 第一.PERCENT w3cschool中不断的更新着新的知识点.有些感觉都没有这个概念,应该是几乎没有用在工作上的缘故吧如查询数据前面的一半: SELECT TOP 50 PERCENT * ...
- sql 累计占比_排名、占比、增长率怎么算,一个SQL语句搞定。(oracle 10g以上支持正则表达式)...
Oracle分析函数使用总结 1.使用评级函数 评级函数(ranking function)用于计算等级.百分点.n分片等等,下面是几个常用到的评级函数: RANK():返回数据项在分组中的排名.特点 ...
- SQL求总和的百分比
思路分析: 先通过group by得到每个分类别的总和,再通过开窗函数计算整体的总和,两者相除就得到占比了. 当over()后不加任何内容时,就是对所有的数据进行汇总. 1.使用over (parti ...
- sql 累计占比_SAS累积占比_累积比数模型
最近用spss处理数据,但是spss缺乏变量内的计算.想算出一个累积占比还得靠SAS 首先 数据手动导入命名class; 然后 数据按某一列降序排列: proc sort data=class ou ...
- mysql中sql命令大小写吗_sql语句大小写有关系吗?
展开全部 SQL大小写并不敏感,bai但是如du果是引起来的字符,zhidao则是区分大小写的, 示例专如下, 1.创建测试属表,create table test_uporlow(id number ...
- sql 累计占比_制作有累积和占比的销售统计表
现有这样的产品月销售明细表 希望按下面的样子,按类别分组统计各产品销售额,销售额从高到低排序,并增加组内累积及占比. 数据文件:产品销售明细.xls 制作报表过程 1. 打开润乾报表工具并新建空白报 ...
- server sql 数据总行数_sql统计行数的语句
求一个sql统计行数的语句 col1 col2 ------------------- A1 2010xx A2 2010cx A1 2010ddd A2 2011dfsd A3 ...
最新文章
- java批量修改txt文件_Java小工具 根据文本批量修改文件名
- TCP面向连接的socket通信
- ceph-deploy install时,远端节点在执行apt-get update命令时失败
- 桩筏有限元中的弹性板计算_采用PKPM系列JCCAD软件桩筏筏板有限元方法计算的模型参数 -...
- 训练日志 2018.9.8
- Android什么时候用抽象类什么时候用接口
- 可以看游资的app_大大游资软件下载
- Ubuntu带给我们的商机
- windows server winrm介绍
- Linuxmint 19双显卡切换的巨坑
- padavan手动安装php
- linux安装Android Studio
- mysql查询各专业人数_查询各专业的学生数。
- POE交换机怎么开启poe功能
- unity移动端材质丢失呈洋红色问题记录
- 企业招聘网络推广运营人员的岗位工作职责该如何写?
- SQL语法笔记和常用技巧收集
- 分类模型指标ks的含义
- Headlike设计模式幕布笔记
- 本博客搜索,因为csdn的搜索功能不好使,所以使用google做个搜索