如何计算列中的百分比?

Posted

技术标签:

【中文标题】如何计算列中的百分比?【英文标题】:How to calculate percentage in column? 【发布时间】:2017-03-28 14:07:26 【问题描述】:

我的任务是计算部门中最低的薪水,以及它占总薪水的百分比。 我也只能使用一个选择语句,可能我需要使用窗口函数。

我就是这样开始的:

     SELECT distinct department_id,
     min(salary) over(partition by department_id) as min_sal
     FROM employees;

但如果我使用 RATIO_TO_REPORT 函数,它会显示所有表,而不是按部门 ID 分组。

【问题讨论】:

输出中需要每位员工一行(非常奇怪),还是每个部门只需要一行?或者你也需要得到工资最低的员工姓名? 分享一些样本数据集和预期结果。 【参考方案1】:

听起来像

select min(salary) as min_salary, round( min(salary)/sum(salary) * 100 , 1 ) as percent
from   employees
group by department_id
;

如果您还需要每个部门中薪水最低的员工的姓名(假设始终只有一个),则添加

    , min(empl_name) keep (dense_rank first order by salary) as min_sal_empl_name

SELECT 声明。如果可以有最低工资的关系,并且您需要所有员工,请这样说 - 在这种情况下,您可能需要您猜到的分析函数。比如:

select empl_name, salary, round(salary/tot_sal*100, 1) as percent
from   ( select empl_name, salary, 
                sum(salary) over (partition by department_id)            as tot_sal,
                rank() over (partition by department_id order by salary) as rn
         from   employees 
       )
where  rn = 1
;  

添加:OP 表示他们毕竟需要薪水占总薪水的百分比(跨所有部门)。这可以通过将ratio_to_report() 与空窗口条件(没有任何“分区”)与rank() 按部门分区来获得每个部门的最低工资来完成。

如果您不喜欢 over () 中的 ratio_to_report() 中的窗口子句,也可以将其写为 over (partition by null) 以使其超级明确,无需或不需要分区。

该解决方案使用 SCOTT 架构中的 EMP 表进行测试,因为原始帖子不包含示例数据。

select deptno, empno, ename, sal, percent
from   (
         select empno, ename, sal, deptno,
                round(100 * ratio_to_report(sal) over (), 1)   as percent,
                rank() over (partition by deptno order by sal) as rn
         from   scott.emp
       )
where  rn = 1
;


DEPTNO  EMPNO  ENAME    SAL  PERCENT
------  -----  ------  ----  -------
10       7934  MILLER  1300      4.5
20       7369  SMITH    800      2.8
30       7900  JAMES    950      3.3

【讨论】:

是的,我需要所有这些,我使用的查询类似于您的上一个查询,但有一个问题,它可以一个 select 语句。您的第一个查询在各方面都很完美,除了它以错误的方式计算百分比。 @E.Saraf - 带有子查询的选择语句(子选择语句)仍然是单个选择语句。然后:如果你认为我的第一个计算是错误的,请解释它是哪里错误的——否则我不能把你当回事。 (无论如何,你可能错了,但如果你不分享你认为不正确的东西,我不能告诉你。) 你的计算是正确的。但我需要知道部门最低工资有多少百分比来自总和,而不是部门总和。在第二个查询中很容易修复,但有没有办法在您的第一个查询中做到这一点? @E.Saraf - 是你写的,不是我写的:但如果我使用 RATIO_TO_REPORT 函数,它会显示所有表格,而不是按部门 ID 分组。 你是什么意思?如果您需要与总和相比的百分比,而不是按部门,那么您帖子中的最后一句话是什么意思?对我来说,这意味着您需要按部门 id 分组的结果,而 RATIO_TO_REPORT 不能使用,因为它没有那样分组。 (顺便说一句,RATIO_TO_REPORT 可以双向使用,但这是另一回事。) @E.Saraf - 发布一个计算公司总工资百分比的解决方案,并使用 ratio_to_report 来展示如何使用它。

以上是关于如何计算列中的百分比?的主要内容,如果未能解决你的问题,请参考以下文章

如何从一列中计算过去 X 周数据的百分比?

使用 R 根据另一列中的类别计算列和列表之间常见值的百分比

如何添加百分比列

在 python pandas 中使用 groupby 的列中出现的百分比

计算列中值的百分位数

excel如何计算占总数的百分比