5

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

我有两张桌子:

Elements - 这包含一个elementID和一个elementName字段
Exchanges - 这包含一个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 以便我可以检索我正在寻找的值?

4

1 回答 1

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;
于 2012-11-14T01:40:02.600 回答