2011-11-08 16 views
10

Estoy tratando de mostrar el salario promedio máximo; sin embargo, parece que no puedo hacer que funcione.Cómo encontrar la media máxima

puedo obtener una lista de los sueldos medios para mostrar con:

select worker_id, avg(salary) 
from workers 
group by worker_id; 

Sin embargo, cuando trato de mostrar una lista del salario promedio máxima con:

select max (avg(salary)) 
from (select worker_id, avg(salary) 
     from workers 
     group by worker_id); 

que doesn' corre Aparece un error de "identificador no válido". ¿Cómo uso el salario promedio de cada trabajador para encontrar el promedio máximo para cada trabajador?

Gracias.

+2

que sería de esperar una columna llamada WORKER_ID a ser la clave principal de una tabla llamada trabajadores. De ser así, el salario de AVG() sería el promedio de toda la tabla, y el salario MAX (AVG()) sería el salario de AVG(). Sin embargo, sospecho que es solo un modelo de datos shonky. – APC

+0

Otra posibilidad es que la clave para la tabla sea una combinación de worker_id y date; de ​​ser así, un promedio ponderado por número de días puede ser más útil que un promedio aritmético simple. –

Respuesta

19

Las columnas resultantes de las funciones agregadas (por ejemplo, prom) suelen tener nombres arbitrarios. Sólo tiene que utilizar un alias para él y seleccione el que:

select max (avg_salary) 
from (select worker_id, avg(salary) AS avg_salary 
    from workers 
    group by worker_id); 
+0

esto selecciona el salario medio más alto pero no indica a qué se asigna el WorkerID. Use esto para agregar los IDs también [Máximo de promedios] (http://stackoverflow.com/questions/2439627/maximum-of-averages) – Takedasama

-1

También puede hacer esto con un solo select declaración (la combinación de ambos max y avg) como esto

select max(avg(salary)) max_avg_salary 
from workers 
group by worker_id; 
0

Puede corregir la consulta mediante la adición de un alias de columna a la columna dentro de la sub-consulta, así:

select max(avg_salary) 
from (select worker_id, avg(salary) avg_salary 
     from workers 
     group by worker_id); 

Sin embargo, si worker_id identifica de forma exclusiva reco RDS en la tabla de los trabajadores, esto es funcionalmente equivalente a (puede simplificarse a):

select max(salary) from workers; 
1
select worker_id, avgsal 
from 
(
    select worker_id, avg(salary) as avgsal 
    from workers 
    group by worker_id 
) 
where avgsal=(select max(avgsal) 
       from (select worker_id, avg(salary) as avgsal 
        from workers group by worker_id)) 

Esto mostrará el promedio más alto junto con id trabajador

0
select max(a.high)Avg_highest_salary, 
     e.dept 
from (
    select avg(salary) high,dept from emp group by dept) a, 
    emp e 
where a.dept = e.dept 
group by e.dept 
order by max(a.high) desc 

Se mostrará el alto Salario medio más alto primero con departamento

Si no quiere mostrar el salario con el departamento entonces usted puede utilizar este

select max(avg(salary)) max_avg_salary 
from emp 
group by dept; 
0

usando cláusula WITH se puede hacer como

with averagesal as (
select dept_id d_id, avg(sal) avgsal from emp_details group by dept_id) 
select * from averagesal where avgsal = (select max(avgsal) from averagesal); 
-1

Como se explica here puede utilizar

SELECT worker_id, AVG(salary) 
FROM workers 
GROUP BY worker_id 
HAVING AVG(salary) = (SELECT MAX(AVG(salary)) FROM workers GROUP BY worker_id) 
0

puedas en este forma en que la primera fila se ordena de forma descendente según el promedio de búsqueda

seleccione la parte superior 1 worker_id, avg (sueldo) como avgsalary de trabajadores grupo por worker_id ordenado por la descripción avgsalary

Cuestiones relacionadas