sql - 如何计算百分比条件聚合
问题描述
我有一个数据表,请参阅http://sqlfiddle.com/#!4/cf72da/5 使用数据透视语句,我可以按标题细分计数
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 完成此任务吗?
解决方案
正如其他海报所指出的那样,您可以(并且应该)使用分析函数来解决这类问题。
专门针对您的用例,有一个RATIO_TO_REPORT
功能 - 使用它比在您的尝试和几个答案中“手动”计算事物要好得多。
请注意我所做的另一项更改 - 当“工人”和 0 “否则”时的总和与计算“工人”相同。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;
感谢您发布测试数据和您的尝试 - 这非常有帮助!
推荐阅读
- java - Java类内部静态接口的使用
- scikit-learn - 参数“coef0”是否表示 sklearn.svm.SVC 方法中的特定系数?
- c# - 检测用户何时暂时停止在 UITextField Xamarin iOS 上输入
- jgit - 来自 git.pull().call() 的受影响文件列表
- udp - 如何使用 Gstreamer 命令行在数据包中发送一行
- python - 按值排序字典
- c# - 为什么我的跳跃动画在中间停止并返回空闲?
- angularjs - 将此多重条件转换为 ng 类条件
- kubernetes - 如何专门为 Pod 创建 PV
- java - 如何在多个服务器中处理相同的多个请求