2016-10-06 2 views
-1

나는 급여가있는 직원 테이블이 있습니다. 저는 모든 종업원에 대해 월급 - 평균 (급여)을 기재하고 싶습니다. 누군가가 같은 SQL 쿼리를 도와주십시오 수 있습니다.집계 함수 적용 모든 열

답변

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이나 샘플 데이터가 없거나 주어진 입력으로부터 예상되는 출력이 없다는 가정하에 우리가 원하는 출력을 정확하게 추측했다고 가정하면 그 목적을 상당히 잘 수행해야합니다.

계산 된 차이 이외에 평균 급여 [모든 행에 대한 평균값]를 포함 할 필요가없는 경우, 다음은 [소수 결과로 선택적 캐스팅으로 표시됨] 스칼라 subselect를 사용하여 값은 각 종업원 급여에서 뺄 :

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 

상응하는 결과를 줄 수있는 쿼리의 여러 형태가있을 수 있습니다 . (계산 된 값을 캐스팅하지 않았으므로 은 정확히이 아닙니다.