如何在sql server中获得列值的平均值

时间:2014-08-14 10:10:48

标签: sql sql-server sql-server-2008

我希望获得列的平均值

姓名薪水

HI 33168,00

你好32882,00

当我尝试使用以下查询时

 select Name, Salary, Avg(Salary) as avg from table group by name, Salary

我的薪水和平均薪水都是相同的价值。

预期结果:

       Name         Salary       

        HI          33168,00    

        Hello       32882,00         

        avg         33025,00 

4 个答案:

答案 0 :(得分:1)

如果按[姓名]和[薪水]分组,假设您的姓名是唯一的,您将获得每个[姓名]一个平均工资,这将与工资值相同

select Avg(Salary) as avg from table

如果您想要详细信息和平均行,则可以使用union all

   select name, Salary  from table
    UNION ALL 
    select 'Avg', Avg(Salary)  from table

答案 1 :(得分:1)

要获得所有Salary值的总体平均值,请不要对结果进行分组:

select Avg(Salary) as avg from table

要获得每个Salary的{​​{1}}的平均值,您必须仅按Name分组,而不是Name分组:

Salary

这将计算表格中每个名称的工资平均值。

答案 2 :(得分:1)

如果按名称和薪水分组,每个此类组合将获得一行。在许多情况下,这意味着avg(薪水)将与薪水相同。如果您只想获得每个名字的平均值(工资):

select Name, Avg(Salary) as avg from table group by name

如果你想要每个人的薪水,你可以用工会来做:

select Name, Avg(Salary) as salary from table group by name
union
select Name, Salary from table

后者的捷径是:

select Name, Salary, Avg(Salary) as salary from table
GROUP BY GROUPING SETS((Name, salary), (Name))

答案 3 :(得分:0)

如果您只想在现有表格中添加平均工资,可以使用with rollup(或grouping sets):

select coalesce(name, 'avg') as name, avg(salary) as salary
from table
group by name, salary with rollup;

avg(salary)对名称没有任何作用,但它确实允许with rollup添加一行的总体平均值。

如果每个名称有多行,并且您想要平均值,则可以执行以下操作:

select coalesce(name, 'avg') as name, avg(salary) as salary
from table
group by name with rollup;