oracle sql中如何计算百分比

新手上路,请多包涵

我有一个表,其中有多个 ID,可以有一个值或 0。这些 ID 来自不同的来源,所以我想知道每个来源的值为 0 的 ID 占总 ID 的百分比是多少文件。

样本数据:

 ID  Source
1    aaa
0    aaa
2    bbb
0    ccc
3    ccc
0    ccc
5    aaa
0    bbb
6    bbb
7    bbb

我需要显示输出,如:

 CountOfIDs0   TotalIDs Source  PercentageIDs0
2               3         ccc     66.6%%
1               3         aaa     33.3%%
1               4         bbb     25%

谢谢!

原文由 AnnaB 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.5k
2 个回答

如果您想要 66.6% 而不是 66.7% 的结果,您可以使用 trunc() 而不是 round() (尽管后者可能更好)。而且您需要将 a/b 舍入到小数点后三位,所以乘以 100 后还剩下一位。

然后,您可以在一个查询中同时计算两个计数,并且您也可以在同一个查询中添加百分比计算。

 select count(case when propkey = 0 then 1 end) countid0,
       count(propkey) totalidcount,
       source,
       to_char(round(count(case when properkey = 0 then 1 end)/count(properkey), 3)*100)
                                                                   || '%' percentageids0
from......

原文由 user5683823 发布,翻译遵循 CC BY-SA 3.0 许可协议

我会这样做:

 With MyRows AS (
  SELECT 1 ID, 'aaa' SOURCE FROM DUAL UNION ALL
  SELECT 0, 'aaa' FROM DUAL UNION ALL
  SELECT 2, 'bbb' FROM DUAL UNION ALL
  SELECT 0, 'ccc' FROM DUAL UNION ALL
  SELECT 3, 'ccc' FROM DUAL UNION ALL
  SELECT 0, 'ccc' FROM DUAL UNION ALL
  SELECT 5, 'aaa' FROM DUAL UNION ALL
  SELECT 0, 'bbb' FROM DUAL UNION ALL
  SELECT 6, 'bbb' FROM DUAL UNION ALL
  SELECT 7, 'bbb' FROM DUAL
)
SELECT
  DISTINCT SOURCE,
  SUM(CASE WHEN ID = 0 THEN 1 ELSE 0 END) OVER (PARTITION BY SOURCE) ZERO_IDS,
  COUNT(ID) OVER (PARTITION BY SOURCE) TOTAL_IDS,
  (100 * SUM(CASE WHEN ID = 0 THEN 1 ELSE 0 END) OVER (PARTITION BY SOURCE))/(COUNT(ID) OVER (PARTITION BY SOURCE)) PERCENTAGE
FROM MyRows
;

原文由 am2 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进