sql统计多个字段值数量
如A表:姓名,班级,得分,考试时间,需要新建B表:班级,一月总分,二月总分,三月总分.....请问要如何实现,谢谢!...
如A表:姓名,班级,得分,考试时间,
需要新建B表:班级,一月总分,二月总分,三月总分.....
请问要如何实现,谢谢! 展开
需要新建B表:班级,一月总分,二月总分,三月总分.....
请问要如何实现,谢谢! 展开
1个回答
展开全部
分两步实现
按月汇总
行列转换
请试一下,如有疑问,及时沟通!
----生成相应的技巧性文章
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
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询