我提前道歉,因为我对SQL有些新意,所以我的代码可能看起来根本没有任何意义,但我会尝试尽可能多地理解它,希望你们更有经验的人可以帮助我出。我不确定它是否会有所帮助,但我使用的是Oracle数据库。
我有两张桌子:
元素 - 包含 elementID 以及 elementName 字段
交换 - 包含 exchangeID 和 elementID 字段
我创建了以下查询,以便仅检索超过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,以便我可以检索我正在寻找的值?
答案 0 :(得分:2)
您需要预先聚合两个派生表(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;