我下面有一张桌子
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,然后取临时表列的平均值。只是想知道是否有更好的方法。
答案 0 :(得分:1)
我将使用cross apply
和grouping 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)
因此,您需要每行和每列的平均值?我将执行两个单独的计算,一个用于行,另一个用于列。通读表并找到每一行的平均值,将列值存储在临时列表或列表中。