我在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变量的一个子集。这是一个更大问题的简化例子。
是否有任何有效的方法从总数中选择子集(类型),然后获得百分比?
答案 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
会返回fieldE
,NULL
中不会计入COUNT()
。