SQLite | SQLite関数 | avg関数で平均値を求める

avg()関数は指定したカラムの平均値を求めます。ここでは、その使い方を説明します。

avg関数の使い方

avg()で平均値を計算します。構文は次のとおりです。

avg(カラム名)

指定カラムのNULL以外を平均します。すべてNULLならNULLを返し、GROUP BYを使うとグループごとに計算します。

数値に変換できない文字列は0として扱われます。

例として次のテーブルを作成します。

create table user (name text, point integer, gender text);
sqlite> create table user (name text, point integer, gender text);
sqlite> 

次のデータを追加します。

insert into user values ('dekuma', 72, 'Man');
insert into user values ('kimkc', 94, 'Woman');
insert into user values ('araikuma', 58, 'Woman');
insert into user values ('happykuma', 82, 'Man');
sqlite> insert into user values ('dekuma', 72, 'Man');
sqlite> insert into user values ('kimkc', 94, 'Woman');
sqlite> insert into user values ('araikuma', 58, 'Woman');
sqlite> insert into user values ('happykuma', 82, 'Man');
sqlite> 

avg()pointの平均を求めます。

select avg(point) from user;
sqlite> .mode column
sqlite> .header on
sqlite> 
sqlite> select avg(point) from user;
avg(point)
----------
76.5      
sqlite> 

平均は(72 + 94 + 58 + 82) ÷ 4 = 76.5です。

次にgenderでグループ化して平均を求めます。

select gender, avg(point) from user group by gender;
sqlite> select gender, avg(point) from user group by gender;
gender      avg(point)
----------  ----------
Man         77.0      
Woman       76.0      
sqlite> 

GROUP BYを使うとグループ単位で計算され、man77woman76になります。

平均対象にNULLや文字列がある場合

NULLは計算から除外されます。次の行を追加します。

insert into user values ('raccoon', NULL, 'Man');
sqlite> insert into user values ('raccoon', NULL, 'Man');
sqlite> 
sqlite> select * from user;
name        point       gender    
----------  ----------  ----------
dekuma      72          Man       
kimkc       94          Woman     
araikuma    58          Woman     
happykuma   82          Man       
raccoon                 Man       
sqlite> 

もう一度pointの平均を求めます。

select avg(point) from user;
sqlite> select avg(point) from user;
avg(point)
----------
76.5      
sqlite> 

NULLは無視されるため、平均は76.5のままです。

次に、数値へ変換できない文字列を追加します。これは0として扱われます。

insert into user values ('mykuma', 'NODATA', 'Woman');
sqlite> insert into user values ('mykuma', 'NODATA', 'Woman');
sqlite> 
sqlite> select * from user;
name        point       gender    
----------  ----------  ----------
dekuma      72          Man       
kimkc       94          Woman     
araikuma    58          Woman     
happykuma   82          Man       
raccoon                 Man       
mykuma      NODATA      Woman     
sqlite> 

avg()pointの平均を求めます。

select avg(point) from user;
sqlite> select avg(point) from user;
avg(point)
----------
61.2      
sqlite> 

文字列を0として含めるため、平均は(72 + 94 + 58 + 82 + 0) ÷ 5 = 61.2です。除外されない点に注意してください。