首页 > 解决方案 > SQL Server 中的平均行数

问题描述

我有下表

Col1  Col2  Col3  Col4   Col5
TotalAvg 68.79 65.39 88.21  63.14

我已经保存了 TotalAvg 行中所有列的总数,但现在我想计算 TotalAvg 行的平均值。有人可以告诉我如何计算行平均值。

我在寻找

Select Avg(Col2,Col3,Col4,Col5)
    where Col1 = 'TotalAvg'

谢谢

标签: sqlsql-serversql-server-2012

解决方案


如果您碰巧需要更动态的方法(即可变列),并且如果您对 TVF 持开放态度,请考虑以下事项:

编辑

第一个参数是要排除的列的分隔列表。例如:'IDNr,Year,AnyOtherNumericCol'

例子

Select A.* 
      ,B.*
 From  YourTable A
 Cross Apply [dbo].[tvf-Stat-Row-Agg]('',(Select A.* for XML Raw)) B

退货

Col1        Col2    Col3    Col4    Col5    RetCnt  RetSum  RetMin  RetMax  RetAvg  RetStd
TotalAvg    68.79   65.39   88.21   63.14   4       285.53  63.14   88.21   71.3825 11.4562162892757

有兴趣的TVF

CREATE FUNCTION [dbo].[tvf-Stat-Row-Agg](@Exclude varchar(500),@XML xml)
Returns Table 
As
Return (  
    Select RetCnt = Count(Value)
          ,RetSum = Sum(Value)
          ,RetMin = Min(Value)
          ,RetMax = Max(Value)
          ,RetAvg = Avg(Value)
          ,RetStd = Stdev(Value)
    From  (
            Select Item  = convert(varchar(100),xAttr.query('local-name(.)'))
                  ,Value = try_convert(float,xAttr.value('.','varchar(max)'))
             From  @XML.nodes('//@*') x(xAttr)
          ) S
    Where charindex(','+S.Item+',',','+@Exclude+',')=0
);

编辑 2

如果列是固定的,并且性能是最重要的,那么......

Select A.* 
      ,B.*
 From  YourTable A
 Cross Apply (
               Select AvgVal = avg(Value)
                 From (values (Col2)
                             ,(Col3)
                             ,(Col4)
                             ,(Col5)
                      ) B1(Value)
             ) B

推荐阅读