从SQL中较大的选择中有效地选择子集

时间:2015-01-19 18:21:59

标签: sql oracle

我在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变量的一个子集。这是一个更大问题的简化例子。

是否有任何有效的方法从总数中选择子集(类型),然后获得百分比?

1 个答案:

答案 0 :(得分:4)

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

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

CASE不是所选值时,NULL会返回fieldENULL中不会计入COUNT()

相关问题