计算每行的平均值,然后计算每列的平均值

时间:2019-01-30 19:34:59

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

我下面有一张桌子

Col1    Col2    Col3    Col4
NULL    NULL    NULL    54.84
NULL    NULL    NULL    75.40
57.24   73.61   NULL    NULL

我想先计算行的平均值,然后再计算列的最终平均值

所以我的计算结果变为

    Row1Avg   54.84
    Row2Avg   75.40
    Row3Avg   65.42

然后我得出Row1Avg,Row2Avg,Row3Avg = 65.22的最终平均值

请告诉我如何有效地实现这一目标。我当时的想法是,我有一个带有单列的临时表,我在其中存储行的AVG,然后取临时表列的平均值。只是想知道是否有更好的方法。

3 个答案:

答案 0 :(得分:1)

我将使用cross applygrouping sets

select t.id, avg(row_avg)
from t cross apply
     (select avg(col) as row_avg
      from (values (col1), (col2), (col3), (col4)) v(col)
     ) s
group by grouping sets ( (id), () );

以上假设您具有唯一的ID以标识每一行。如果没有,那么您需要像union all这样的东西:

with s as (
      select t.*, s.row_avg
      from t cross apply
           (select avg(col) as row_avg
            from (values (col1), (col2), (col3), (col4)) v(col)
           ) s
     )
select s.row_avg
from s
union all
select avg(s.row_avg)
from s;

答案 1 :(得分:1)

尝试使用CROSS APPLY

SELECT 
    AVG(t2.Average)
FROM
    Table t1
    CROSS APPLY (
        SELECT Average = AVG(Value) 
        FROM (VALUES (Col1), (Col2), (Col3), (Col4)) B1(Value)
    ) t2

结果为65.221666

答案 2 :(得分:0)

因此,您需要每行和每列的平均值?我将执行两个单独的计算,一个用于行,另一个用于列。通读表并找到每一行的平均值,将列值存储在临时列表或列表中。