2009-04-02 17 views
8

AVG() calcola-colonna mezzi ma come posso recuperare la media di più valori nella stessa fila in questo modo:Query MySQL: come calcolare la media dei valori di una riga?

SELECT MEAN(A.a, A.b, ... , A.n) FROM A; 

EDIT: sicuro, come cherouvim suggerisce che possa fare:

SELECT MEAN(A.a + A.b + ... + A.n)/n FROM A; 

ma sto cercando di scoprire se c'è un modo più snello.

+0

Rich B: Ho il mio modo personale come voglio a fare domande, non c'è bisogno di cambiare le mie intestazioni sistematicamente ! – markus

+0

Se nella disposizione che descrivi hai colonne, è una bandiera rossa che questa tabella non è normalizzata correttamente. Dovrebbero essere righe in una tabella figlio. –

+0

@ Bill: forse un odore ma non penso che sia il caso qui. Ho un singolo risultato del questionario in una riga di dati che corrisponde a un utente e una misurazione. – markus

risposta

7
select (A.a + A.b)/2 from A; 
+0

beh, ne ho bisogno più generico, che significa x vars. – markus

+0

Sicuramente saprai sempre il numero o le colonne per una data tabella? –

+0

@tharkun: significa che selezionerai le colonne X e non conosci X? cosa stai cercando di realizzare? – cherouvim

0

Se nessun altro trova una soluzione migliore, è sempre possibile aggiungerli insieme, quindi dividere per il numero di colonne aggiunte.

0

Non carino, ma funziona.

Non specificamente MySql, ma l'idea dovrebbe essere abbastanza facile da tradurre.

CREATE TABLE A (id int identity(1,1), C1 int, C2 int, C3 int) 
GO 

INSERT INTO A VALUES (1,1,1) 
INSERT INTO A VALUES (2,2,2) 
INSERT INTO A VALUES (3,3,3) 
INSERT INTO A VALUES (1,2,3) 
INSERT INTO A VALUES (4,5,6) 
GO 

CREATE VIEW A_Values 
AS 
SELECT ID, AVG(Val) AS Average 
FROM 
(
    SELECT ID, C1 AS Val FROM A 
    UNION ALL 
    SELECT ID, C2 AS Val FROM A 
    UNION ALL 
    SELECT ID, C3 AS Val FROM A 
) Q 
GROUP BY ID 
GO 


SELECT * FROM A_Values 
GO 
+0

interessante ma non mysql e non più snello;) – markus

0

Non ho dimestichezza con la sintassi di MySQL, ma per quanto riguarda il dumping i dati di riga in una tabella temporanea, come più righe con una sola colonna, e quindi utilizzando la funzione AVG() per ottenere il risultato?

1

Mi sono imbattuto in una situazione simile. Questo è venuto utile: http://tech-blog.borychowski.com/index.php/2009/02/mysql/average-value-in-a-row/

Dalla pagina:

Quando facciamo:

SELECT *, (V.rank_0 + V.rank_1 + V.rank_2)/3 
AS row_avg FROM voting V 

riceviamo solo le medie corrette per le righe in cui tutti i valori non sono NULL. Ma quando ho per es. 3, NULL, 4 Mi piacerebbe ottenere 3,5 come ritorno. Questo è il momento in cui la funzione COALESCE() è a portata di mano.

Cosa fa COALESCE()? Dal manuale MySQL abbiamo:

Restituisce il primo valore non NULL nell'elenco o NULL se non ci sono valori non NULL.

mysql> SELECT COALESCE(NULL,1); 
-> 1 
mysql> SELECT COALESCE(NULL,NULL,NULL); 
-> NULL 

E queste informazioni ci aiuteranno a costruire un'altra istruzione SELECT:

SELECT *, 

#first part 
(COALESCE(V.rank_0, 0) 
+ COALESCE(V.rank_1, 0) 
+ COALESCE(V.rank_2, 0)) 
/

#second part 
(3 - 
(COALESCE(V.rank_0 - V.rank_0, 1) 
+ COALESCE(V.rank_1 - V.rank_1, 1) 
+ COALESCE(V.rank_2 - V.rank_2, 1)) 
) AS row_avg FROM voting V 
Problemi correlati