在 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
将returnNULL
,NULL
不计入COUNT()
].
我在 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
将returnNULL
,NULL
不计入COUNT()
].