李四 85 92 82
看SQL一个晚上,以为自己能写出来,结果还是网上找到了答案。答案是对,但不知道这样写好不好。
select name , max(case SUBJECT when '数学' then VALUE else 0 end) [数学] , max(case subject when '英语' then VALUE else 0 end) [英语] , max(case subject when '语文' then VALUE else 0 end) [语文] from a group by name
找到答案,利用动态查询如下:
declare @sql varchar(8000) SET @sql='select name' select @sql = @sql + ',max(case Subject when '''+Subject+''' then value end) ['+Subject+']' from (select distinct Subject from dbo.a)AS a select @sql = @sql+' from a group by name' exec(@sql)
可以加上print @sql 查看内容
declare @sql varchar(8000) set @sql = 'select name ' select @sql = @sql + ' , max(case subject when ''' + subject + ''' then value else 0 end) [' + subject + ']' from (select distinct subject from a) as a SELECT @sql = @sql + ' , cast(avg(value*1.0) as decimal(18,2)) 平均分 , sum(value) 总分 from a group by name' PRINT @sql exec(@sql)
cast(avg(value*1.0) as decimal(18,2))
CAST (expression AS data_type)
decimal(3,2)
decimal:
3—整数部分加小数部分长度为 3 1—小数部分长度为 1 参数说明:expression:任何有效的SQServer表达式。
AS:用于分隔两个参数,在AS之前的是要处理的数据,在AS之后是要转换的数据类型。
data_type:目标系统所提供的数据类型,包括bigint和sql_variant,不能使用用户定义的数据类型。
平均分和总分也算出来