2011-10-25 12 views
10

Obecnie pracuję nad zadaniem, które wymaga ode mnie znalezienia średniej liczby zasobów dla każdego modułu. Obecna tabela wygląda tak:Średnia dla liczby() w tym samym zapytaniu

ResourceID ModulID 
    1   1 
    2   7 
    3   2 
    4   4 
    5   1 
    6   1 

Tak więc, w zasadzie próbuję dowiedzieć się, jak uzyskać średnią liczbę zasobów. Jedyne odpowiednie dane testowe dotyczą modułu 1, do którego podłączono 3 różne zasoby. Ale muszę wyświetlić wszystkie wyniki.

To jest mój kod:

select avg(a.ress) GjSnitt, modulID 
from 
(select count(ressursID) as ress 
from ressursertiloppgave 
group by modulID) as a, ressursertiloppgave r 
group by modulID; 

Oczywiście to nie działa, ale jestem obecnie na straty na co zmienić w tym momencie. Byłbym wdzięczny za wszelkie opinie, które macie.

+0

Nie można po prostu użyć zapytanie zewnętrzną ('AVG () 'zgrupowane przez ModulId) bez wewnętrznego zapytania? Myślę, że przyniosłoby oczekiwane rezultaty. –

+0

Problem z AVG() polega na tym, że przyjmuje on wartość razem i przyjmuje średnią z pojedynczej wartości. Przykładowo, Zasoby 1,5 i 6 tworzą 12. Które następnie wykorzystuje do pobrania średniej sumy. Potrzebuję go 1,5, ponieważ istnieją 3 identyfikatory resourceIDs podłączone do ModulID 1. – Coss

Odpowiedz

21

To jest kwerenda, którą wykonujesz, napisana w nieco mniej rozwlekłej składni.

SELECT 
    avg(a.ress) as GjSnitt 
    , modulID 
FROM 
    (SELECT COUNT(ressursID) as ress 
    FROM ressursertiloppgave 
    GROUP BY modulID) as a 
CROSS JOIN ressursertiloppgave r <--- Cross join are very very rare! 
GROUP BY modulID; 

Jesteś krzyż łączące tabeli, dzięki czemu (6x6) = 36 wierszy w sumie i kondensacyjne to w dół do 4, ale dlatego, że łączna liczba wynosi 36, wynik jest błędny.
Dlatego nigdy nie należy używać niejawnych połączeń.

Przepisz zapytanie do:

SELECT AVG(a.rcount) FROM 
    (select count(*) as rcount 
    FROM ressursertiloppgave r 
    GROUP BY r.ModulID) a 

Jeśli chcesz indywidualną rowcount i średniej na dole zrobić:

SELECT r1.ModulID, count(*) as rcount 
FROM ressursertiloppgave r1 
GROUP BY r1.ModulID 
UNION ALL 
    SELECT 'avg = ', AVG(a.rcount) FROM 
    (select count(*) as rcount 
    FROM ressursertiloppgave r2 
    GROUP BY r2.ModulID) a 
+0

Otrzymuję wartość pierwszego modulID, który wyświetla poprawny wynik. Ale jak uzyskać resztę modulIDów do naśladowania? Kiedy dołączę modulID w pierwszym wyborze i zrobię grupę za pomocą modulID, otrzymam ten sam wynik wyświetlany przez każdy modulID. – Coss

+0

@Coss, zobacz zaktualizowane pytanie. – Johan

+0

Ah, widzę! Ale myślę, że byłem niezdarny z moim pytaniem. To, czego szukam, to średnia z każdego rzędu, jeśli to możliwe. – Coss

Powiązane problemy