【问题标题】:Calculate percentage rows over some specific value计算某个特定值的百分比行
【发布时间】:2017-08-18 16:36:55
【问题描述】:

是否有任何 oracle 函数可以帮助我计算接受某些条件的行的百分比

示例表:

   WorkerId   Salary    DepartmentId

   10001       2000.00      1
   10002       2500.00      2
   10004       3000.00      1
   10005       3500.00      1

我想知道每个部门工资超过 2100.00 的工人的百分比是多少

【问题讨论】:

    标签: sql oracle percentage


    【解决方案1】:

    你可以使用RATIO_TO_REPORT:

    SELECT departmentID, 100 * SUM(rr) AS total_percentage
    FROM  (SELECT t.*, RATIO_TO_REPORT(1) OVER (PARTITION BY DepartmentId) AS rr
           FROM your_tab t) s
    WHERE salary > 2100
    GROUP BY departmentId;
    

    DBFiddle Demo

    输出:

    DEPARTMENTID TOTAL_PERCENTAGE
    1            66.66
    2            100
    

    【讨论】:

    【解决方案2】:

    尝试使用两个GROUP BYJOIN

    SELECT yt.DepartmentId, t.hs/count(*) * 100
    FROM your_tab yt
    JOIN 
    (
       SELECT DepartmentId, count(*) as hs
       FROM your_tab
       WHERE salary > 2100
       GROUP BY DepartmentId
    ) t ON yt.DepartmentId = t.DepartmentId
    GROUP BY yt.DepartmentId, t.hs
    

    dbfiddle

    【讨论】:

      【解决方案3】:

      您无需使用分析函数即可执行此操作,如下所示:

      WITH sample_data AS (SELECT 10001 workerid, 2000 salary, 1 departmentid FROM dual UNION ALL
                           SELECT 10002 workerid, 2500 salary, 2 departmentid FROM dual UNION ALL
                           SELECT 10004 workerid, 3000 salary, 1 departmentid FROM dual UNION ALL
                           SELECT 10005 workerid, 3500 salary, 1 departmentid FROM dual)
      -- end of subquery mimicking a table with your data in it.
      -- see SQL query below:
      SELECT departmentid,
             100*(COUNT(CASE WHEN salary > 2100 THEN 1 END)/COUNT(*)) pct_earning_gt_2100
      FROM   sample_data
      GROUP BY departmentid;
      
      DEPARTMENTID PCT_EARNING_GT_2100
      ------------ -------------------
                 1    66.6666666666667
                 2                 100
      

      这使用条件计数(请记住,大多数聚合函数会忽略空值)来确定有多少行满足条件,然后除以每个部门的总行数。

      这应该比涉及 ratio_to_report 分析函数的解决方案性能更高,因为它不需要在进行分组之前执行该额外步骤,但是您应该测试两种解决方案以找出哪个解决方案实际上更适合您的数据。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-11-25
        • 1970-01-01
        • 2019-02-09
        • 1970-01-01
        • 2015-10-11
        • 2021-04-06
        • 2021-11-22
        相关资源
        最近更新 更多