5

私はSQLに少し慣れていないので、私のコードはまったく意味がないように見えるかもしれませんが、できる限り理解できるように努めます.経験豊富な人が助けてくれることを願っています. 役立つかどうかはわかりませんが、Oracle データベースを使用しています。

私は2つのテーブルを持っています:

Elements - これにはelementIDelementNameフィールドが含まれます
Exchanges - これには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)))

この式は私が探しているパーセンテージを与えてくれますが、対応する elementName とペアリングできるように SELECT で取得できるような方法でこの式を使用する方法を見つけることができませんでした今説明したような方法で。

探している値を取得できるように、この値を SELECT に伝達する方法はありますか?

4

1 に答える 1

2

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 に答える