从HAVING子句表达式投影值



我提前道歉,因为我对SQL有点陌生,所以我的代码可能看起来毫无意义,但我会尽可能多地理解它,希望你们这些更有经验的人能帮助我。我不确定它是否会有帮助,但我使用的是Oracle数据库。

我有两张桌子:

元素-包含elementID元素名称字段
交易所–包含exchangeIDelementID字段

我创建了以下查询,以便只检索50%以上的交易所中出现的元素:

SELECT e.elementName
FROM Elements e
WHERE e.elemID in
(SELECT elemID FROM Exchanges
GROUP BY elemID
HAVING (count(*) / (SELECT count(*) FROM
(SELECT exchangeID, count(*) FROM Exchanges GROUP BY exchangeID))) > 0.5);

这部分似乎运行良好,但我还需要检索交换中每个项目的出现次数%。例如,如果元素A出现在76%的交换中,元素B出现在59%的交换中。我想返回一行A和76%,另一行B和59%。在我看来,这意味着以某种方式获得HAVING子句左侧表达式的结果:

(count(*) / (SELECT count(*) FROM
(SELECT exchangeID, count(*) FROM Exchanges GROUP BY exchangeID)))

这个表达式给了我想要的百分比,但我还没能找到一种方法来使用这个表达式,这样我就可以用SELECT检索它,这样我就能像刚才解释的那样将它与对应的elementName配对。

有没有一种方法可以将这个值传播到我的SELECT,这样我就可以检索到我要查找的值?

您需要预先聚合两个派生表(1)每个元素的交换,以及(2)交换的总数。剩下的都是初级的。

SELECT x.elementName, A.elemExchanges/B.totalExchanges Percentage
FROM
(
SELECT x.elemID,
count(distinct x.exchangeID) elemExchanges
FROM Exchanges x
GROUP BY x.elemID
) A
CROSS JOIN
(
SELECT COUNT(distinct y.exchangeID) totalExchanges
FROM Exchanges y
) B
JOIN Elements e on e.elemID = A.elemID
WHERE A.elemExchanges/B.totalExchanges > 0.5;

最新更新