在所有列上应用聚合函数

时间:2016-10-06 22:58:31

标签: sql database db2 oracle-sqldeveloper

我有一个带薪水的员工表。我想为每个员工列出薪资 - 平均薪资(薪水)。有人可以帮我解决相同的SQL查询。

5 个答案:

答案 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

可能有许多形式的查询可以提供相同的结果。 (虽然我没有抛弃计算出的值,因此不是完全相等的结果值。)