4

いくつかの平均を実行する必要がある単純なテーブル(テスト)があります(行の平均と「合計」列の平均を取得したい)。

 id  var1  var2  var3
 1   7     NULL  3
 2   10    NULL  6

MySQL AVG() 関数がカウントから NULL 値を除外していることに気付きました (それらは 0 としてカウントされません)。これは私が望むものです。

同様に、次の結果が必要です。

var1 var2  var3 total
8.5  NULL  4.5  6.5   (i.e. the overall average is 6.5 *not* 4.3333)

しかし、私のクエリは次のようになります。

SELECT
AVG(var1) AS var1,
AVG(var2) AS var2,
AVG(var3) AS var3,
(
 AVG(var1)+ 
 AVG(var2)+
 AVG(var3)
)/3.0 AS metric_total
FROM test

これは合計平均 4.333 を返します。

AVG() 関数と同じように、単一のクエリで NULL エントリをカウントから除外する行平均を取得することは可能ですか?

4

4 に答える 4

1

すべての列の var1、var2、および var3 のすべての平均が必要です。おそらく、各列のサブ選択を行って平均を取得し、各サブ選択を結合します。欠点は、これは各列に同じ数のnull以外のフィールドがある場合にのみ機能することです

SELECT AVG(FirstAvg)
FROM
(
    SELECT AVG(var1) AS FirstAvg
    FROM test
    UNION
    SELECT AVG(var2) AS FirstAvg
    FROM test
    UNION
    SELECT AVG(var3) AS FirstAvg
    FROM test
) Sub1

その問題を修正するには、サブ選択でAVGを1回実行するだけです

SELECT AVG(FirstAvg)
FROM
(
    SELECT var1 AS FirstAvg
    FROM test
    UNION
    SELECT var2 AS FirstAvg
    FROM test
    UNION
    SELECT var3 AS FirstAvg
    FROM test
) Sub1

他の列の平均も取得するには:-

SELECT AVG(var1), AVG(var2), AVG(var3), AVG(FirstAvg) AS total
FROM
(
    SELECT var1 AS var1, NULL AS var2, NULL AS var3, var1 AS FirstAvg
    FROM test
    UNION
    SELECT NULL AS var1, var2 AS var2, NULL AS var3, var2 AS FirstAvg
    FROM test
    UNION
    SELECT NULL AS var1, NULL AS var2, var3 AS var3, var3 AS FirstAvg
    FROM test
) Sub1
于 2013-07-04T12:51:15.440 に答える
0

AVG(var1), AVG(var2)etc の代わりに使用してみてくださいAVG(ISNULL(var1,0)), AVG(ISNULL(var2,0))

于 2013-07-04T12:50:44.867 に答える