2016-10-06 3 views

Antwort

2

Sie können dies mit Fensterfunktionen tun:

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

Sie könnten einen Inline-View verwenden, um eine einzelne Zeile mit dem durchschnittlichen Gehalt zurückzukehren. und verbinden Sie diese Zeile zurück mit der Mitarbeiter-Tabelle.

Etwas wie folgt aus:

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

Nur ein paar andere Variationen; die anderen, die bereits gepostet wurden, sollten dem Zweck ziemlich gut dienen - vorausgesetzt, wir haben alle die gewünschte Ausgabe richtig erkannt, weder DDL noch Beispieldaten noch die erwartete Ausgabe von den gegebenen Eingaben.

Wenn es nicht erforderlich ist, das gemittelte Gehalt [als Durchschnitt über alle Zeilen] zusätzlich zu der berechneten Differenz einzubeziehen, verwendet das folgende [mit optionalem Umwandeln in ein Dezimalergebnis] einen skalaren Subselect, um das zu erhalten Wert von jedem Mitarbeiter Gehalt abzuziehen:

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

Oder die gemittelten Gehälter sowohl in der Differenz und als Säule für sich zu verwenden, dann wieder die skalare subselect, aber für die seitliche Referenz in dem [explizit joined- zur Verfügung gestellt zu] Unterabfrage; wieder, optional Casting für Dezimalergebnisse:

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

andere Lösung;)

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

Und noch eine andere Variante:

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 

Es kann viele Formen von Abfragen, die zu vergleichbaren Ergebnissen führen kann . (Obwohl ich aufgehört habe, die berechneten Werte zu werfen, also nicht genau gleiche Ergebniswerte.)

Verwandte Themen