mssql sqlserver 获取一个班级每月的得分汇总


摘要:
下文讲述使用sql脚本的方法,将数据库中每月每班的得分计算出来,如下所示:
实验环境:sql server 2008 R2

例:
存在一个学生成绩表,列名: 姓名、班级、分数、考试时间
————————-需输出———————
班级、一月得分、二月得分、三月得分

如下代码所示:

----生成相应的技巧性文章
create table #maomao365
(
[姓名] nvarchar(30),
[班级] nvarchar(20),
[分数] int,
[考试时间] date
)
go

insert into #maomao365 (
 [姓名],[班级],
[分数],[考试时间]
)values
('张三','一班',89,'2019-1-1'),
('李四','二班',100,'2019-1-1'),
('王二','三班',60,'2019-1-1'),
('马子','四班',70,'2019-1-1'),
('maomao','一班',89,'2019-1-1'),
('小屋','二班',15,'2019-2-1'),
('sql','三班',69,'2019-2-1'),
('教程','四班',72,'2019-2-1'),
('宇宙','一班',63,'2019-3-1'),
('周猫猫','一班',50,'2019-4-1'),
('宙斯盾','二班',23,'2019-5-1'),
('潜水艇','三班',21,'2019-6-1'),
('其它','四班',20,'2019-7-1')
go

 
 

/*拼接字符串*/
declare @sql varchar(max)
set @sql =' select * from 
 (select  [班级],
[分数],month([考试时间]) as month from  #maomao365) as d
   pivot(sum([分数]) for [month] 
   in( 
 ';



/*动态组合列名*/
 declare @lieMing varchar(7000)   ---定义动态生成列名存放变量
 declare @i int ,@imax int,@field varchar(60)  ---定义临时循环变量
 declare @fieldList table(keyId int identity,field varchar(60)) ---定义临时表,存放待生成动态列名的数据
 insert into @fieldList(field) select distinct month([考试时间]) from #maomao365  ---生成列名数据
 
 -------------循环表生成列名start--------------
 set @lieMing =''
 set @i=1 
 select @imax =max(keyId) from @fieldList t
 while @i <@imax 
 begin
    select @field =field from @fieldList t where t.keyId=@i
    if isnull(@field,'') !=''
     begin
        if @lieMing !='' begin set @lieMing =@lieMing +',' end
        set @lieMing = @lieMing+'['+@field+']';
     end
    set @i=@i+1
 end
  -------------循环表生成列名end--------------
/*动态组合列*/

set @sql =@sql +@lieMing +' ))  t ;';    ---拼接sql语句

print (@sql)

exec  (@sql)           


go
truncate table  #maomao365
drop     table  #maomao365 
go