2016-10-06 10 views
-1

私は給与を持つ従業員テーブルを持っています。私は、従業員ごとに給与 - 平均(給与)を記載したいと思います。誰かが同じのSQLクエリで私を助けてくださいできますか?あなたは平均給与で単一の行を返すためにインライン・ビューを使用することができ集計関数をすべての列に適用

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

答えて

2

あなたは、この使用してウィンドウ関数を行うことができます。その行を従業員表に戻すことができます。このような

何か:

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もサンプルデータも与えられておらず、与えられた入力からの期待される出力も与えられていないと仮定すれば、すでに投稿された他のものは目的を十分に果たすべきです。

計算された差に加えて、平均給与[すべての行の平均として]を含める必要がない場合、次の[10進結果へのオプションのキャスティングを使用して表示]はスカラー副選択を使用して各従業員の給与から減算する値:

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 

は、同等の結果を与えることができ、クエリの多くの形態があるかもしれません。 (私は計算値をキャストしていませんでしたが、は全く同じ結果値です

関連する問題