Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何计算条件聚合的百分比_Sql_Oracle - Fatal编程技术网

Sql 如何计算条件聚合的百分比

Sql 如何计算条件聚合的百分比,sql,oracle,Sql,Oracle,我有一个数据表,见 使用pivot语句,我能够按标题分解计数 select division, status, sum(case when title = 'worker' then 1 else 0 end) as workerCount, (sum(case when title = 'worker' then 1 else 0 end) / sum(sum(case when title = 'worker' then 1 else 0 end

我有一个数据表,见 使用pivot语句,我能够按标题分解计数

select division, status, 
       sum(case when title = 'worker' then 1 else 0 end) as workerCount,
       (sum(case when title = 'worker' then 1 else 0 end) /
        sum(sum(case when title = 'worker' then 1 else 0 end)) over ()
       )*100 as workerPercent
from ta
group by status, division
order by division, status
结果如下所示:

DIVISION  STATUS    WORKERCOUNT  WORKERPERCENT
11        ready     3            30
11        started   3            30
12        finished  4            40
12        ready     0            0
12        started   0            0
例如,我需要百分比除以除法

DIVISION  STATUS    WORKERCOUNT  WORKERPERCENT
11        ready     3            50
11        started   3            50
12        finished  4            100
12        ready     0            0
12        started   0            0

你知道我如何用SQL实现这一点吗

使用以下查询:

select division, status, 
       sum(case when title = 'worker' then 1 else 0 end) as workerCount,
       (sum(case when title = 'worker' then 1 else 0 end) /
        sum(sum(case when title = 'worker' then 1 else 0 end)) over (PARTITION BY division)
       )*100 as workerPercent
from ta
group by status, division
order by division, status
您缺少分析子句:


你非常接近你的预期结果

您只需在
分析函数
中添加
partition by
子句,如下所示:


干杯

正如其他海报所指出的,你可以(也应该)使用分析函数来解决这类问题

特别是对于您的用例,有
RATIO\u TO\u REPORT
函数-使用它比在您的尝试和几个答案中“手动”计算要好得多

请注意,我做的另一个更改-当“worker”和0“others”之和等于计数“worker”<在此上下文中,code>COUNT比
SUM
更清晰

select division, status, 
       count(case when title = 'worker' then 1 end) as workerCount,
       ratio_to_report(count(case when title = 'worker' then 1 end))
           over (partition by division)*100 as workerPercent
from  ta
group by status, division
order by division, status;
感谢您发布测试数据和您的尝试-这非常有帮助

SQL> SELECT
  2      DIVISION,
  3      STATUS,
  4      SUM(CASE WHEN TITLE = 'worker' THEN 1 ELSE 0 END) AS WORKERCOUNT,
  5      ( SUM(CASE WHEN TITLE = 'worker' THEN 1 ELSE 0 END) /
  6              SUM(SUM(CASE WHEN TITLE = 'worker' THEN 1 ELSE 0 END))
  7                  OVER( PARTITION BY DIVISION )  -- Changes here
  8      ) * 100 AS WORKERPERCENT
  9  FROM TA
 10  GROUP BY STATUS, DIVISION
 11  ORDER BY DIVISION, STATUS;

  DIVISION STATUS               WORKERCOUNT WORKERPERCENT
---------- -------------------- ----------- -------------
        11 ready                          3            50
        11 started                        3            50
        12 finished                       4           100
        12 ready                          0             0
        12 started                        0             0

SQL>
select division, status, 
       count(case when title = 'worker' then 1 end) as workerCount,
       ratio_to_report(count(case when title = 'worker' then 1 end))
           over (partition by division)*100 as workerPercent
from  ta
group by status, division
order by division, status;