我有一个带薪水的员工表。我想为每个员工列出薪资 - 平均薪资(薪水)。有人可以帮我解决相同的SQL查询。
答案 0 :(得分:2)
您可以使用窗口功能执行此操作:
select e.*,
(salary - avg(salary) over ()) as diff
from employees e;
答案 1 :(得分: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
答案 2 :(得分:0)
其他几个变种;已经发布的其他人应该很好地服务于这个目的 - 假设我们都没有正确推断出所需的输出,没有DDL也没有样本数据,也没有给定输入的预期输出。
如果除了计算的差异之外没有要求包括平均工资[作为所有行的平均值],则以下[用可选的十进制结果转换显示]使用标量子选择来获取值减去每个员工的工资:
select emp.*
, dec( salary - ( select avg(salary)
from employee_table )
, 11, 0 ) as saldif
from employee_table as emp
或者在差异和单独使用列中使用平均工资,然后再使用标量子选择,但在[显式连接]子查询中可用于横向引用;再次,十进制结果的可选转换:
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
答案 3 :(得分: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
答案 4 :(得分: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
可能有许多形式的查询可以提供相同的结果。 (虽然我没有抛弃计算出的值,因此不是完全相等的结果值。)