Name Subject Value
张三 语文 80
张三 数学 90
张三 英语 85
李四 语文 85
李四 数学 92
李四 英语 82
查询出表
Name 语文 数学 英语
张三 80 90 85
李四 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,不能使用用户定义的数据类型。
平均分和总分也算出来