这个问题出现在许多实际情况中,其中缺失值将被替换为从剩余可用值确定的预期值。我试图计算n列上的A列的平均值,比如C1,...,Cn可以有空值。每当其中一列为空时,我想将计算的平均值替换为其他列中存在的值,并排除空列。因此,例如,如果只有3列(c1,C2和C3),那么所有三列都有一个值,我想报告这三列中子组的平均值。如果缺少一列(即第三列),则会计算其他两列的平均值。如果还缺少第二列,则仅计算一列的平均值。
所以一个答案就是报告:
Select Avg(A) as AvgA
From Table
Group by C1, C2, and C3
对于C3为空且C1和C2的值为v1和v2的情况,则应将AvgA计算为:
Select Avg(A) as AvgA
From Table
Where C1=v1 and C2=v2
Group by C1, C2
任何人都可以给我一个代码,自动为所有n列执行此操作吗?一般的n列解决方案需要能够使用n-1 Group By列并删除一个为null的列。需要在v1到vn-1值处评估n-1 Group-By。
答案 0 :(得分:0)
如果3列中的一列为空,则它将自动使用另外两列进行分组。如果3中的2个为空,则第三个用于分组。如果所有3都为null,则在结果中将获得一行,其中所有3都为null作为分组。
Select c1, c2, c3, Avg(A) as AvgA From Table Group by C1, C2, and C3
即。根据我对您的问题的理解,您只需按列进行分组。
如果一个简单的方法不够,那么你可以尝试这样的事情:
Select
coalesce(c1,c2,c3) c123
, coalesce(c2,c3) c23
, c3
, Avg(A) as AvgA
Avg(A) as AvgA From Table
Group by
coalesce(c1,c2,c3)
, coalesce(c2,c3)
, c3