如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
HYPERLINK"http://www.cnblogs.com/Bowen80/archive/2008/07/14/1242596.html"SQLServer行列转换/*标题:普通行列转换(version2.0)作者:爱新觉罗.毓华时间:2008-03-09地点:广东深圳说明:普通行列转换(version1.0)仅针对sqlserver2000提供静态和动态写法,version2.0增加sqlserver2005的有关写法。问题:假设有张学生成绩表(tb)如下:姓名课程分数张三语文74张三数学83张三物理93李四语文74李四数学84李四物理94想变成(得到如下结果):姓名语文数学物理----------------李四748494张三748393-------------------*/createtabletb(姓名varchar(10),课程varchar(10),分数int)insertintotbvalues('张三','语文',74)insertintotbvalues('张三','数学',83)insertintotbvalues('张三','物理',93)insertintotbvalues('李四','语文',74)insertintotbvalues('李四','数学',84)insertintotbvalues('李四','物理',94)go--SQLSERVER2000静态SQL,指课程只有语文、数学、物理这三门课程。(以下同)select姓名as姓名,max(case课程when'语文'then分数else0end)语文,max(case课程when'数学'then分数else0end)数学,max(case课程when'物理'then分数else0end)物理fromtbgroupby姓名--SQLSERVER2000动态SQL,指课程不止语文、数学、物理这三门课程。(以下同)declare@sqlvarchar(8000)set@sql='select姓名'select@sql=@sql+',max(case课程when'''+课程+'''then分数else0end)['+课程+']'from(selectdistinct课程fromtb)asaset@sql=@sql+'fromtbgroupby姓名'exec(@sql)--SQLSERVER2005静态SQL。select*from(select*fromtb)apivot(max(分数)for课程in(语文,数学,物理))b--SQLSERVER2005动态SQL。declare@sqlvarchar(8000)select@sql=isnull(@sql+',','')+课程fromtbgroupby课程exec('select*from(select*fromtb)apivot(max(分数)for课程in('+@sql+'))b')---------------------------------/*问题:在上述结果的基础上加平均分,总分,得到如下结果:姓名语文数学物理平均分总分--------------------------李四74849484.00252张三74839383.33250*/--SQLSERVER2000静态SQL。select姓名姓名,max(case课程when'语文'then分数else0end)语文,max(case课程when'数学'then分数else0end)数学,max(case课程when'物理'then分数else0end)物理,cast(avg(分数*1.0)asdecimal(18,2))平均分,sum(分数)总分fromtbgroupby姓名--SQLSERVER2000动态SQL。declare@sqlvarchar(8000)set@sql='select姓名'select@sql=@sql+',max(case课程when'''+课程+'''then分数else0end)['+课程+']'from(selectdistinct课程fromtb)asaset@sql=@sql+',cast(avg(分数*1.0)asdecimal(18,2))平均分,sum(分数)总分fromtbgroupby姓名'exec(@sql)--SQLSERVER2005静态SQL。selectm.*,n.平均分,n.总分from(select*from(select*fromtb)apivot(max(分数)for课程in(语文,