SQL题目

来源:互联网 发布:nginx test config 编辑:程序博客网 时间:2024/06/01 09:03
有张学生成绩表a如下
  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,不能使用用户定义的数据类型。


平均分和总分也算出来

0 0
原创粉丝点击