19

私がやっていること:

create table sample (id INT(10) PRIMARY KEY AUTO_INCREMENT,name varchar(255),marks INT(10));

insert into sample (name,marks) VALUES('sam',10);
insert into sample (name,marks) VALUES('sam',20);
insert into sample (name,marks) VALUES('sam',NULL);
insert into sample (name,marks) VALUES('sam',NULL);
insert into sample (name,marks) VALUES('sam',30);

select AVG(marks) from sample GROUP BY(name);

私が期待した出力:

平均値 = (10+20+30)/5 = 12

MYSQL の出力:

平均値 = (10+20+30)/3 = 20

理想的には、MYSQL は 5 行の合計を取得して 5 で割る必要がありますが、3 で割るだけです (非 NULL 行)。

なぜこれが発生し、正しい AVG、つまり 60/5 を取得するにはどうすればよいですか? PS: マーク フィールドを NOT NULL にすることはできません。私のデータベース設計では、マーク フィールドを NULL にすることが許可されています。

ありがとうございました

4

5 に答える 5

1

NULLはゼロではないため、これは通常の動作です。5 + NULLの平均をどのように作成しますか?したがって、MySQLは平均化できる行のみを取得します。

他のユーザーがすでに提供している正解から、COALESCE関数を使用することもできます。この関数は、リストで指定した最初のNULL以外の値を返すため、NULLを好きなものに置き換えることができます。

    SELECT AVG(COALESCE(marks,0)) FROM sample GROUP BY(name);
于 2012-12-24T11:58:54.160 に答える