SQL Server AVG 平均

AVG 平均

SQL Server の対象データの平均値の求めるときに、AVG関数を使います。

平均値はいろいろなデータ分析で使用されるので良く使う指標だと思います。

構文: AVG ( [ ALL | DISTINCT ] expression )
引数: ALL すべての値に集計関数が適用されます。 ALL が既定値です。
    DISTINCT 一意な値の合計を返すことを指定します。
expression 定数、列、関数、および算術演算子、ビット演算子、文字列演算子の組み合わせを指定します。
NULL 値はすべて無視されます。(対象データになりません)

下のSQL例文を載せておきます。

declare @tbl1 table(a_class varchar(3), b_kbn char(1), c_point int)
insert into @tbl1 (a_class,b_kbn,c_point) values ('001','1',80)
insert into @tbl1 (a_class,b_kbn,c_point) values ('001','2',60)
insert into @tbl1 (a_class,b_kbn,c_point) values ('001','3',40)
insert into @tbl1 (a_class,b_kbn,c_point) values ('001','4',30)
insert into @tbl1 (a_class,b_kbn,c_point) values ('001','5',50)
insert into @tbl1 (a_class,b_kbn,c_point) values ('001','6',60)
insert into @tbl1 (a_class,b_kbn,c_point) values ('001','7',22)

--ALL
select AVG(ALL c_point) from @tbl1
select AVG(c_point) from @tbl1 --ALLが無くても同じ結果

--DISTINCT
--60が2行あるため、重複を省き計算される
select AVG(DISTINCT c_point) from @tbl1

--expression
--型変換、小数点以下も求める
select AVG(cast(c_point as float)) from @tbl1 --float型に
select AVG(cast(c_point as decimal(5,2))) from @tbl1
select cast(AVG(cast(c_point as decimal(5,2))) as decimal(5,2)) from @tbl1

もう一例
over や group by 句で括って結果を求める

declare @tbl1 table(a_class varchar(5), b_stdNo char(1), c_point int)
insert into @tbl1 (a_class,b_stdNo,c_point) values ('国語','1',60)
insert into @tbl1 (a_class,b_stdNo,c_point) values ('国語','2',70)
insert into @tbl1 (a_class,b_stdNo,c_point) values ('国語','3',40)
insert into @tbl1 (a_class,b_stdNo,c_point) values ('国語','4',20)
insert into @tbl1 (a_class,b_stdNo,c_point) values ('国語','5',40)
insert into @tbl1 (a_class,b_stdNo,c_point) values ('国語','6',50)
insert into @tbl1 (a_class,b_stdNo,c_point) values ('国語','7',20)

insert into @tbl1 (a_class,b_stdNo,c_point) values ('算数','1',70)
insert into @tbl1 (a_class,b_stdNo,c_point) values ('算数','2',60)
insert into @tbl1 (a_class,b_stdNo,c_point) values ('算数','3',50)
insert into @tbl1 (a_class,b_stdNo,c_point) values ('算数','4',80)
insert into @tbl1 (a_class,b_stdNo,c_point) values ('算数','5',30)
insert into @tbl1 (a_class,b_stdNo,c_point) values ('算数','6',60)
insert into @tbl1 (a_class,b_stdNo,c_point) values ('算数','7',40)

insert into @tbl1 (a_class,b_stdNo,c_point) values ('理科','1',90)
insert into @tbl1 (a_class,b_stdNo,c_point) values ('理科','2',70)
insert into @tbl1 (a_class,b_stdNo,c_point) values ('理科','3',40)
insert into @tbl1 (a_class,b_stdNo,c_point) values ('理科','4',70)
insert into @tbl1 (a_class,b_stdNo,c_point) values ('理科','5',60)
insert into @tbl1 (a_class,b_stdNo,c_point) values ('理科','6',50)
insert into @tbl1 (a_class,b_stdNo,c_point) values ('理科','7',50)

insert into @tbl1 (a_class,b_stdNo,c_point) values ('社会','1',30)
insert into @tbl1 (a_class,b_stdNo,c_point) values ('社会','2',50)
insert into @tbl1 (a_class,b_stdNo,c_point) values ('社会','3',90)
insert into @tbl1 (a_class,b_stdNo,c_point) values ('社会','4',40)
insert into @tbl1 (a_class,b_stdNo,c_point) values ('社会','5',70)
insert into @tbl1 (a_class,b_stdNo,c_point) values ('社会','6',80)
insert into @tbl1 (a_class,b_stdNo,c_point) values ('社会','7',30)

insert into @tbl1 (a_class,b_stdNo,c_point) values ('英語','1',80)
insert into @tbl1 (a_class,b_stdNo,c_point) values ('英語','2',60)
insert into @tbl1 (a_class,b_stdNo,c_point) values ('英語','3',40)
insert into @tbl1 (a_class,b_stdNo,c_point) values ('英語','4',30)
insert into @tbl1 (a_class,b_stdNo,c_point) values ('英語','5',50)
insert into @tbl1 (a_class,b_stdNo,c_point) values ('英語','6',60)
insert into @tbl1 (a_class,b_stdNo,c_point) values ('英語','7',20)

select avg(c_point) from @tbl1
select avg(c_point) from @tbl1 where a_class='国語'
select avg(c_point) from @tbl1 where a_class='算数'
select avg(c_point) from @tbl1 where a_class='理科'
select avg(c_point) from @tbl1 where a_class='社会'
select avg(c_point) from @tbl1 where a_class='英語'
select a_class, avg(c_point) from @tbl1 group by a_class  --科目ごとの平均点

select distinct b_stdNo, AVG(c_point) over (partition by b_stdNo) from @tbl1  --生徒ごとの平均点 
select b_stdNo, AVG(c_point) from @tbl1 group by b_stdNo  --生徒ごとの平均点

以上、SQL Server で AVG関数を使い平均値を求めるでした。