2009-04-02 29 views
8

El AVG() calcula columna-medias, pero ¿cómo puedo recuperar la media de varios valores en la misma fila, así:Consulta de MySQL: ¿Cómo calcular el promedio de valores en una fila?

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

EDIT: Seguro, como cherouvim sugiere que puedo hacer:

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

pero estoy tratando de averiguar si hay un camino más delgado.

+0

Rich B: Tengo mi manera personal cómo quiero hacer preguntas, no es necesario cambiar los encabezados de forma sistemática ! – markus

+0

Si tiene columnas en el arreglo que describe, es una señal de que esta tabla no está normalizada correctamente. Deben ser filas en una tabla secundaria. –

+0

@Bill: tal vez un olor, pero no creo que sea el caso aquí. Tengo los resultados de un solo cuestionario en una fila de datos que corresponde con un usuario y una medición. – markus

Respuesta

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

bueno, lo necesito más genérico, lo que significa para x vars. – markus

+0

Seguramente siempre sabrá el número o las columnas de una tabla determinada. –

+0

@tharkun: ¿esto significa que seleccionará X columnas y no conoce X? ¿Qué está tratando de lograr? – cherouvim

0

Si nadie más encuentra una solución mejor, siempre puede simplemente agregarlos juntos, luego dividir por el número de columnas que ha agregado.

0

No es bonito, pero funciona.

No específicamente MySql, pero la idea debería ser lo suficientemente fácil como para traducirla.

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

interesante pero no mysql y no más delgado;) – markus

0

No estoy familiarizado con la sintaxis de MySQL, pero ¿qué pasa con el dumping los datos de fila en una tabla temporal como varias filas con una sola columna, y luego usando la función AVG() para obtener el resultado?

1

Me encontré con una situación similar. Esto vino útil: http://tech-blog.borychowski.com/index.php/2009/02/mysql/average-value-in-a-row/

Desde la página:

Cuando hacemos:

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

recibimos solamente promedios correctos para las filas en las que todos los valores que no son nulos. Pero cuando tengo, por ejemplo, 3, NULL, 4 Me gustaría obtener 3.5 como devolución. Ese es el momento en que la función COALESCE() es útil.

¿Qué hace COALESCE()? Del manual de MySQL tenemos:

Devuelve el primer valor no NULL de la lista, o NULL si no hay valores no NULL.

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

Y esta información nos ayudará a construir otra instrucción 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 
Cuestiones relacionadas