create table tb(name varchar(10),subject varchar(10),mark int) insert into tb values('A', '語文', 80) insert into tb values('A', '數學', 80) insert into tb values('A', '外語', 80 ) insert into tb values('B', '數學', 80) insert into tb values('B', '外語', 80) insert into tb values('C', '語文', 78) select name , max(case subject when '語文' then mark else 0 end) '語文', max(case subject when '數學' then mark else 0 end) '數學', max(case subject when '外語' then mark else 0 end) '外語', sum(mark)/(select max(cnt) cnt from (select name , count(*) cnt from tb group by name) t) [avg] from tb group by name declare @sql varchar(8000) set @sql = 'select Name as ' + '姓名' select @sql = @sql + ' , sum(case Subject when ''' + Subject + ''' then mark else 0 end) [' + Subject + ']' from (select distinct Subject from tb) as a set @sql = @sql + ' ,sum(mark)/(select max(cnt) cnt from (select name , count(*) cnt from tb group by name) t) [avg] from tb group by name' exec(@sql)