2011-10-25 14 views
10

Attualmente sto lavorando su un compito che richiede di trovare la media sul numero di risorse per ciascun modulo. La tabella corrente si presenta così:Media su un conteggio() nella stessa query

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

Quindi, fondamentalmente, sto cercando di capire come ottenere il numero medio di risorse. Gli unici dati di test relativi a qui sono relativi al modulo 1, al quale sono collegate 3 risorse diverse. Ma ho bisogno di mostrare tutti i risultati.

Questo è il mio codice:

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

Ovviamente non sta funzionando, ma sono attualmente in perdita su cosa cambiare a questo punto. Gradirei davvero ogni contributo che avete.

+0

può non basta usare la query esterna ('AVG () 'raggruppato per ModulId) senza la query interna? Penserei che produrrebbe i risultati previsti. –

+0

Il problema con AVG() è che prende il valore messo insieme e prende la media sul valore singolo. Ad esempio, Resource 1,5 e 6 fa 12. Che poi usa per prendere la somma media. Ho bisogno che sia 1.5, poiché ci sono 3 resourceID collegati a ModulID 1. – Coss

risposta

21

Questa è la query che si sta eseguendo, scritta in una sintassi leggermente meno ottusa.

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; 

Sei trasversale unendo la tabella, rendendo (6x6 = 36) righe in totale e condensazione questo fino a 4, ma perché il conteggio totale è 36, il risultato è sbagliato.
Questo è il motivo per cui non si dovrebbero mai usare i join impliciti.

riscrivere la query per:

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

Se si desidera che il conteggio delle righe individuale e la media in fondo fare:

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

Ricevo il valore per il primo modulID, che mostra il risultato corretto. Ma come faccio a seguire il resto dei modulID? Quando includo modulID nella prima selezione e faccio un gruppo in modulID, ottengo lo stesso risultato visualizzato da ogni modulID. – Coss

+0

@Coss, vedere la domanda aggiornata. – Johan

+0

Ah, capisco! Ma penso di essere stato goffo con la mia domanda. Quello che sto cercando è una media su ogni numero di fila, se possibile. – Coss

Problemi correlati