资源描述:
《sqlserver行列转换pivot、unpivot以及与sql2000比较》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、SQLServer行列转换PivotUnPivot以及与sql2000比较PIVOT用于将列值旋转为列名(即行转列),在SQLServer2000可以用聚合函数配合CASE语句实现PIVOT的一般语法是:PIVOT(聚合函数(列)FOR列in(…))ASP完整语法:table_sourcePIVOT(聚合函数(value_column)FORpivot_columnIN()) UNPIVOT用于将列明转为列值(即列转行),在SQLServer2000可以用UNION来实现完整语法:table_sourceU
2、NPIVOT(value_columnFORpivot_columnIN()) 注意:PIVOT、UNPIVOT是SQLServer2005的语法,使用需修改数据库兼容级别 在数据库属性->选项->兼容级别改为 90 典型实例一、行转列1、建立表格ifobject_id('tb')isnotnulldroptabletbgocreatetabletb(姓名varchar(10),课程varchar(10),分数int)insertintotbvalues('张三','语文',74)insertintotbv
3、alues('张三','数学',83)insertintotbvalues('张三','物理',93)insertintotbvalues('李四','语文',74)insertintotbvalues('李四','数学',84)insertintotbvalues('李四','物理',94)goselect*fromtbgo姓名 课程 分数-------------------------------张三 语文 74张三 数学 83张三 物理
4、 93李四 语文 74李四 数学 84李四 物理 94 2、使用SQLServer2000静态SQL--cselect姓名, max(case课程when'语文'then分数else0end)语文, max(case课程when'数学'then分数else0end)数学, max(case课程when'物理'then分数else0end)物理fromtbgroupby姓名姓名 语文 数学 物理------------
5、-------------------------------李四 74 84 94张三 74 83 93 3、使用SQLServer2000动态SQL--SQLSERVER2000动态SQL,指课程不止语文、数学、物理这三门课程。(以下同)--变量按sql语言顺序赋值declare@sqlvarchar(500)set@sql='select姓名'select@sql=@sql+',max(case课程when'''+课程+''' then分数
6、else0end)['+课程+']'from(selectdistinct课程fromtb)a--同fromtbgroupby课程,默认按课程名排序set@sql=@sql+'fromtbgroupby姓名'exec(@sql) --使用isnull(),变量先确定动态部分declare@sqlvarchar(8000)select@sql=isnull(@sql+',','')+'max(case课程when'''+课程+'''then分数else0end)['+课程+']'from(selectdistinct课程fromtb)
7、asa set@sql='select姓名,'+@sql+'fromtbgroupby姓名'exec(@sql)姓名 数学 物理 语文-------------------------------------------李四 84 94 74张三 83 93 74 4、使用SQLServer2005静态SQLselect*fromtb pivot(max(分数)for课程in(语文,数学,物理))
8、a 5、使用SQLServer2005动态SQL--使用stuff()declare@sqlvarchar(8000)set@sql='' --初始化变量@sqlselect@sql=@sql+','+课程fromtbgroupby