Sql 如何计算条件聚合的百分比
我有一个数据表,见 使用pivot语句,我能够按标题分解计数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
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;