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

如何在sql server中获取列值的平均值,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我想得到一列的平均值 姓名工资 你好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

我想得到一列的平均值

姓名工资

你好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 

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

select Avg(Salary) as avg from table
如果需要详细信息和平均行,可以使用union all

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

要获得所有薪资值的总体平均值,请根本不将结果分组:

select Avg(Salary) as avg from table
要获得每个姓名的平均薪资,您必须仅按姓名分组,而不是按薪资分组:


这将计算表中每个姓名的平均薪资。

如果按姓名和薪资分组,则每个组合将得到一行。在许多情况下,这意味着平均工资将与工资相同。如果您只想获得每个姓名的平均工资:

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))

如果只想将平均工资添加到现有表中,可以与汇总或分组集一起使用:

avgsalary对名称不做任何处理,但它允许with rollup添加一个具有总体平均值的行

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

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