2016-10-06 5 views

ответ

2

Вы можете сделать это с помощью функции окна:

select e.*, 
     (salary - avg(salary) over()) as diff 
from employees e; 
0

Вы можете использовать вложенное вернуть одну строку со средней заработной платой. и присоедините эту строку к таблице сотрудников.

Что-то вроде этого:

SELECT e.emp_id 
     , e.salary 
     , e.salary - a.avg_salary 
    FROM employee e 
    CROSS 
    JOIN (SELECT AVG(t.salary) AS avg_salary 
      FROM employee t 
     ) a 
    ORDER BY e.emp_id 
0

всего несколько других вариантов; другие, уже опубликованные, должны хорошо служить цели - если мы все правильно выведем желаемый результат, не получим DDL или выборочные данные, а также ожидаемый результат от данных входов.

Если нет необходимости включать усредненную зарплату [как среднее значение по всем строкам] в дополнение к вычисленной разнице, то следующее [показанное с необязательным литьем в десятичный результат] использует скалярный подзаголовок для получения значение вычесть из каждой зарплаты работника:

select emp.*         
    , dec(salary - (select avg(salary) 
         from employee_table) 
      , 11, 0) as saldif    
from employee_table as emp  

Или использовать усредненные зарплаты как в разницы и в качестве колонки сам по себе, то опять скалярной подвыборки, но доступны для боковой ссылки в [явно joined- to] подзапрос; опять же, по желанию отливка для десятичных результатов:

select x.*          
from table          
    (select avg(salary)       
    from employee_table       
) as a (avgsal)        
cross join lateral        
    (select emp.*         
     , dec(salary - avgsal , 11) as saldif 
     , dec(avgsal   , 11) as salavg 
    from employee_table as emp     
) as x           
0

другого решения;)

with avgsalary as (
select avg(salary) avgsal from employee_table 
) 
select emp.*, case when emp.salary is null then cast(null as decimal) else round(emp.salary - avgs.avgsal, 2) end as diffsal, avgs.avgsal         
from employee_table as emp cross join avgsalary avgs 
0

И еще один вариант:

with EmpAvg (avgSalary) 
    as (SELECT avg(salary) from employee_table) 
select e.*, a.avgSalary, 
     (e.salary - a.avgSalary) as diffAvg 
from employee_table e cross join EmpAvg a 

Там может быть много форм запросов, которые могут дать эквивалентные результаты , (Несмотря на то, что я отказался от вычисления расчетных значений, то не точно равных значений результата.)

Смежные вопросы