首页 > 开发 > 综合 > 正文

绝妙的SQL行列转换语句

2024-07-21 02:50:38
字体:
来源:转载
供稿:网友
绝妙的SQL行列转换语句

说明:普通行列转换(version 1.0)仅针对sql server 2000提供静态和动态写法,version 2.0增加sql server 2005的有关写法。问题:假设有张学生成绩表(tb)如下:姓名 课程 分数张三 语文 74张三 数学 83张三 物理 93李四 语文 74李四 数学 84李四 物理 94

想变成(得到如下结果):姓名 语文 数学 物理---- ---- ---- ----李四 74 84 94张三 74 83 93-------------------*/createtabletb(姓名varchar(10) , 课程varchar(10) , 分数int)insertintotbvalues('张三','语文',74)insertintotbvalues('张三','数学',83)insertintotbvalues('张三','物理',93)insertintotbvalues('李四','语文',74)insertintotbvalues('李四','数学',84)insertintotbvalues('李四','物理',94)go--SQL SERVER 2000 静态SQL,指课程只有语文、数学、物理这三门课程。(以下同)select姓名as姓名 ,max(case课程when'语文'then分数else0end) 语文,max(case课程when'数学'then分数else0end) 数学,max(case课程when'物理'then分数else0end) 物理fromtbgroupby姓名--SQL SERVER 2000 动态SQL,指课程不止语文、数学、物理这三门课程。(以下同)declare@sqlvarchar(8000)set@sql='select 姓名'select@sql=@sql+', max(case 课程 when'''+课程+'''then 分数 else 0 end) ['+课程+']'from(selectdistinct课程fromtb)asaset@sql=@sql+'from tb group by 姓名'exec(@sql)--SQL SERVER 2005 静态SQL。select*from(select*fromtb) a pivot (max(分数)for课程in(语文,数学,物理)) b--SQL SERVER 2005 动态SQL。declare@sqlvarchar(8000)select@sql=isnull(@sql+'],[','')+课程fromtbgroupby课程set@sql='['+@sql+']'exec('select * from (select * from tb) a pivot (max(分数) for 课程 in ('+@sql+')) b')


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表