按命令进行攻击

时间:2017-11-24 22:55:12

标签: sql-server group-by

这个问题出现在许多实际情况中,其中缺失值将被替换为从剩余可用值确定的预期值。我试图计算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。

1 个答案:

答案 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