2012-11-14 13 views
5

Ich entschuldige mich im Voraus, da ich etwas neu in SQL bin, so mag mein Code mag es macht keinen Sinn, aber ich werde versuchen, so viel Sinn wie ich kann und hoffentlich Sie erfahrenere Leute können mir helfen. Ich bin mir nicht sicher, ob es helfen wird, aber ich verwende eine Oracle-Datenbank.Projizieren eines Werts von Klausel Ausdruck

Ich habe zwei Tabellen:

Elements - Dieser Bereich enthält eine elementID sowie ein element Feld
Exchanges - Dieser Bereich enthält eine ExchangeID und ein elementID Feld

Ich habe die folgende Abfrage erstellt, um nur das Eleme abzurufen nts, ​​die in mehr als 50% der Börsen auftreten:

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); 

Dieser Teil scheint zu funktionieren gut, aber ich brauche auch die% der Vorkommen für jedes Element im Austausch abzurufen. Wenn zum Beispiel ein Element A in 76% der Börsen und ein Element B in 59% der Börsen auftritt, möchte ich eine Reihe mit A und 76% und eine weitere Reihe mit B und 59% zurückgeben. In meinem Kopf würde dies bedeuten, irgendwie das Ergebnis des Ausdrucks immer auf der linken Seite der HAVING-Klausel:

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

Dieser Ausdruck gibt mir den Prozentsatz ich suche, aber ich habe nicht in der Lage gewesen zu Figur Ich habe eine Möglichkeit, diesen Ausdruck so zu verwenden, dass ich ihn mit einem SELECT abrufen kann, so dass ich ihn mit dem entsprechenden ElementName auf eine Weise paaren kann, wie ich es gerade erklärt habe.

Gibt es eine Möglichkeit, diesen Wert zu meinem SELECT zu propagieren, damit ich den Wert abrufen kann, den ich suche?

Antwort

2

Sie möchten zwei abgeleitete Tabellen voraggregieren (1) die Austauschvorgänge pro Element und (2) die Gesamtzahl der Austauschvorgänge. Der Rest wird elementar.

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; 
Verwandte Themen