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

Calculate average per row and then calculate average per column

我有一个table如下所示

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

有人能告诉我如何有效地实现这一目标吗?我是如何考虑这样做的,我有一个 temp table 单列,我在其中存储行的 AVG,然后我只取 temp table 列的平均值。只是想知道是否有更好的方法。

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

我会使用 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;

尝试使用 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