2012-11-14 30 views
5

Przepraszam z góry, ponieważ jestem trochę nowicjuszem w SQL, więc mój kod może wydawać się, że nie ma sensu, ale postaram się uczynić jak najwięcej tego, jak tylko mogę i mam nadzieję bardziej doświadczeni ludzie mogą mi pomóc. Nie jestem pewien, czy to pomoże, ale używam bazy danych Oracle.Wyświetlanie wartości z wyrażenia klauzula HAVING

Mam dwie tabele:

Elementy - ta zawiera elementID jak również pole ElementName
Wymiany - ta zawiera exchangeID i elementID pole

Utworzono następujące zapytanie w celu pobrania tylko eleme NTS, które występują u ponad 50% wymian:

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

Ta część wydaje się działać prawidłowo, ale również trzeba pobierać% wystąpień dla każdej pozycji wymiany. Tak więc, na przykład, jeśli element A występuje w 76% wymian, a element B występuje w 59% wymian, chciałbym zwrócić wiersz z A i 76% i inny wiersz z B i 59%. W moim umyśle, oznaczałoby to jakoś coraz wynik wyrażenia po lewej stronie klauzuli HAVING:

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

Wyrażenie to daje mi procent szukam, ale nie były w stanie rysunek sposób użycia tego wyrażenia w taki sposób, że mogę go odzyskać za pomocą SELECT, dzięki czemu mogę sparować go z odpowiadającym mu elementName w sposób, jaki właśnie wyjaśniłem.

Czy istnieje sposób propagacji tej wartości do mojego SELECT, aby można było pobrać wartość, której szukam?

Odpowiedz

2

Będziesz chciał wstępnie zgrupować dwie wyprowadzone tabele (1) wymiany na element i (2) całkowitą liczbę wymian. Reszta stała się elementarna.

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; 
Powiązane problemy