计算两个选择计数的百分比

问题描述 投票:1回答:3

我有一个查询

select count(1) from table_a where state=1;

它给了20

select count(1) from table_a where state in (1,2);

它给了25

我想查询提取百分比80%(将是20 * 100/25)。可以只在一个查询中使用这些吗?

oracle
3个回答
1
投票

我认为没有测试,以下SQL命令可以做到这一点

SELECT SUM(CASE WHEN STATE = 1      THEN 1 ELSE 0 END)
      /SUM(CASE WHEN STATE IN (1,2) THEN 1 ELSE 0 END)
      as PERCENTAGE
FROM TABLE_A

或以下

SELECT S1 / (S1 + S2) as S1_PERCENTAGE
FROM
    (
    SELECT SUM(CASE WHEN STATE = 1 THEN 1 ELSE 0 END) as S1
          ,SUM(CASE WHEN STATE = 2 THEN 1 ELSE 0 END) as S2
    FROM TABLE_A
    )

或以下

SELECT S1 / T as S1_PERCENTAGE
FROM
    (
    SELECT SUM(CASE WHEN STATE = 1      THEN 1 ELSE 0 END) as S1
          ,SUM(CASE WHEN STATE IN (1,2) THEN 1 ELSE 0 END) as T
    FROM TABLE_A
    )

您可以选择性能或可读性!


1
投票

正如@ schlebe的第一个查询略有不同,您可以通过制作条件继续使用count()

select count(case when state = 1 then state end)
     / count(case when state in (1, 2) then state end) as result
from table_a

或乘以100得到百分比而不是小数:

select 100 * count(case when state = 1 then state end)
           / count(case when state in (1,2) then state end) as percentage
from table_a

Count忽略空值,如果不满足条件,则两个case表达式都默认为null(你可以使用else null使其显式化)。

使用CTE进行虚拟数据的快速演示:

with table_a(state) as (
            select 1 from dual connect by level <= 20
  union all select 2 from dual connect by level <= 5
  union all select 3 from dual connect by level <= 42
)
select 100 * count(case when state = 1 then state end)
           / count(case when state in (1,2) then state end) as percentage
from table_a;

PERCENTAGE
----------
        80

0
投票

为什么plsql标签?无论如何,我认为你需要的是:

(select count(1) from table_a where state=1) * 100 /  (select count(1) from table_a where state in (1,2)) from dual
© www.soinside.com 2019 - 2024. All rights reserved.