从具有条款表达的方面投射价值

时间:2012-11-14 00:58:19

标签: sql

我提前道歉,因为我对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,以便我可以检索我正在寻找的值?

1 个答案:

答案 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;