全网最全最详细 死磕:SQL行转列汇总( 二 )

--使用stuff()DECLARE @sql VARCHAR(8000)SET @sql = ''--初始化变量@sqlSELECT@sql = @sql + ',' + 课程FROMtbGROUP BY 课程--变量多值赋值--同select @sql = @sql + ','+课程 from (select distinct 课程 from tb)aSET @sql = STUFF(@sql, 1, 1, '')--去掉首个','SET @sql = ' select m.* , n.总分,n.平均分 from(select * from (select * from tb) a pivot (max(分数) for 课程 in (' + @sql+ ')) b) m ,(select 姓名,sum(分数)总分, cast(avg(分数*1.0) as decimal(18,2)) 平均分 from tb group by 姓名) nwhere m.姓名= n.姓名'EXEC(@sql) --或使用isnull()DECLARE @sql VARCHAR(8000)SELECT@sql = ISNULL(@sql + ',', '') + 课程FROMtbGROUP BY 课程SET @sql = 'select m.* , n.总分,n.平均分 from(select * from (select * from tb) a pivot (max(分数) for 课程 in (' + @sql+ ')) b) m ,(select 姓名,sum(分数)总分, cast(avg(分数*1.0) as decimal(18,2)) 平均分 from tb group by 姓名) nwhere m.姓名= n.姓名'EXEC(@sql)2.3 列转行2.3.1建立表格IF OBJECT_ID('tb') IS NOT NULL DROP TABLE tbgoCREATE TABLE tb(姓名 VARCHAR(10),语文 INT,数学 INT,物理 INT)INSERT INTO tb VALUES('张三',74,83,93)INSERT INTO tb VALUES('李四',74,84,94)goSELECT * FROM tb姓名 语文 数学 物理
---------- ----------- ----------- -----------
张三 74 83 93
李四 74 84 94
2.3.2使用SQL Server 2000静态SQL--SQL SERVER 2000静态SQL 。select*from( select姓名,课程='语文',分数=语文fromtb unionall select姓名,课程='数学',分数=数学fromtb unionall select姓名,课程='物理',分数=物理fromtb) torderby姓名,case课程when'语文'then1when'数学'then2when'物理'then3end姓名 课程 分数
---------- ---- -----------
李四 语文 74
李四 数学 84
李四 物理 94
张三 语文 74
张三 数学 83
【全网最全最详细 死磕:SQL行转列汇总】张三 物理 93
2.3.2使用SQL Server 2000动态SQL--SQL SERVER 2000动态SQL 。--调用系统表动态生态 。declare@sqlvarchar(8000)select@sql=isnull(@sql+' union all ','')+' select姓名, [课程]='+quotename(Name,'''')+' , [分数] = '+quotename(Name)+' from tb'fromsyscolumnswhereName!='姓名'andID=object_id('tb')--表名tb,不包含列名为姓名的其他列orderbycolidexec(@sql+' order by姓名')go 2.3.3使用SQL Server 2005静态SQL--SQL SERVER 2005动态SQLSELECT姓名 ,课程 ,分数FROMtb UNPIVOT ( 分数 FOR 课程 IN ( [语文], [数学], [物理] ) ) t 2.3.4使用SQL Server 2005动态SQL--SQL SERVER 2005动态SQLDECLARE @sql NVARCHAR(4000)SELECT@sql = ISNULL(@sql + ',', '') + QUOTENAME(name)FROMsyscolumnsWHEREid = OBJECT_ID('tb')AND name NOT IN ( '姓名' )ORDER BY colidSET @sql = 'select 姓名,[课程],[分数] from tb unpivot ([分数] for [课程] in(' + @sql+ '))b'EXEC(@sql)



推荐阅读