在 SQL 中从更大的选择中有效地选择一个子集

Efficiently selecting a subset from a bigger selection in SQL

我在 Oracle SQL 中有一个可怕的查询。我的问题是我需要获取两个相关查询的百分比。

所以,我正在做的是:

SELECT type*100/decode(total, 0, 1, total) as result
from (SELECT
(select count(*) from tb1, tb2, tb3
where tb1.fieldA = tb2.fieldB
and tb2.fieldC = tb3.fieldD
and tb3.fieldE = 'Some stuf') as type,
(select count(*) from tb1, tb2, tb3
where tb1.fieldA = tb2.fieldB
and tb2.fieldC = tb3.fieldD) as total from dual) auxTable;

如您所见,我的名为 type 的变量是 total 变量的一个子集。这是一个更大问题的简化示例..

有什么有效的方法可以从总数中选择子集(类型)然后得到百分比吗?

是的,有一种更有效的方法:

SELECT type*100/DECODE(total, 0, 1, total) FROM (
    SELECT COUNT(*) AS total, SUM(DECODE(tb3.fieldE, 'Some stuf', 1, 0)) AS type
      FROM tb1, tb2, tb3
     WHERE tb1.fieldA = tb2.fieldB
       AND tb2.fieldC = tb3.fieldD
);

SUM(DECODE(tb3.fieldE, 'Some stuf', 1, 0) 将获得 tb3.fieldE = 'Some stuff' 的所有记录的计数。或者,您可以使用:

COUNT(CASE WHEN tb3.fieldE = 'Some stuff' THEN 1 END) AS type

fieldE不是选择的值时CASE将returnNULLNULL不计入COUNT() ].