SQL Server 行转列,列转行。多行转成一列
一、多行轉(zhuǎn)成一列(并以","隔開)
表名:A
表數(shù)據(jù):
想要的查詢結(jié)果:
查詢語句:
SELECT name ,value = ( STUFF(( SELECT ',' + valueFROM AWHERE name = Test.nameFORXML PATH('')), 1, 1, '') ) FROM A AS Test GROUP BY name;PS:STUFF語句就是為了去掉第一個(gè)【逗號(hào)】
附STUFF用法:(從原字符的第二個(gè)開始共三個(gè)字符替換為后面的字符)
SELECT STUFF('abcdef', 2, 3, 'ijklmn');查詢結(jié)果:aijklmnef
?二、一列轉(zhuǎn)成多行
表名:tb
表數(shù)據(jù):
想要的結(jié)果:
查詢語句:
SELECT a.[name],b.[value] FROM (SELECT [name],[value]=CAST('<v>'+REPLACE([value],',','</v><v>')+'</v>' AS xml) FROM tb) a OUTER APPLY (SELECT [value]=T.C.value('.','varchar(50)') FROM a.[value].nodes('/v') AS T(C)) b?三、行轉(zhuǎn)列(轉(zhuǎn)自大神張志濤的博客 http://www.cnblogs.com/zhangzt/archive/2010/07/29/1787825.html)
1、建立表格
IF OBJECT_ID('tb') IS NOT NULL DROP TABLE tbgoCREATE TABLE tb(姓名 VARCHAR(10),課程 VARCHAR(10),分?jǐn)?shù) INT)INSERT INTO tb VALUES('張三','語文',74)INSERT INTO tb VALUES('張三','數(shù)學(xué)',83)INSERT INTO tb VALUES('張三','物理',93)INSERT INTO tb VALUES('李四','語文',74)INSERT INTO tb VALUES('李四','數(shù)學(xué)',84)INSERT INTO tb VALUES('李四','物理',94)goSELECT * FROM tb2、使用SQL Server 2000靜態(tài)SQL
SELECT 姓名,max(CASE 課程 WHEN '語文' THEN 分?jǐn)?shù) ELSE 0 end)語文,max(CASE 課程 WHEN '數(shù)學(xué)' THEN 分?jǐn)?shù) ELSE 0 end)數(shù)學(xué),max(CASE 課程 WHEN '物理' THEN 分?jǐn)?shù) ELSE 0 end)物理FROM tbGROUP BY 姓名3、使用SQL Server 2005靜態(tài)SQL
SELECT * FROM tb PIVOT( MAX(分?jǐn)?shù)) FOR 課程 IN ( 語文, 數(shù)學(xué), 物理 ) ) a;4、使用SQL Server 2005動(dòng)態(tài)SQL
--使用stuff()DECLARE @sql VARCHAR(8000)SET @sql='' --初始化變量@sqlSELECT @sql=@sql+','+課程 FROM tb GROUP BY 課程 --變量多值賦值SET @sql=stuff(@sql,1,1,'')--去掉首個(gè)','SET @sql='select * from tb pivot (max(分?jǐn)?shù)) for 課程 in ('+@sql+'))a'exec(@sql)--或使用isnull()DECLARE @sql VARCHAR(8000)SELECT @sql=isnull(@sql+',','')+課程 FROM tb GROUP BY 課程 SET @sql='select * from tb pivot (max(分?jǐn)?shù)) for 課程 in ('+@sql+'))a'exec(@sql)四、行轉(zhuǎn)列結(jié)果加上總分、平均分
1、使用SQL Server 2000靜態(tài)SQL
SELECT 姓名,max(CASE 課程 WHEN '語文' THEN 分?jǐn)?shù) ELSE 0 end)語文,max(CASE 課程 WHEN '數(shù)學(xué)' THEN 分?jǐn)?shù) ELSE 0 end)數(shù)學(xué),max(CASE 課程 WHEN '物理' THEN 分?jǐn)?shù) ELSE 0 end)物理,sum(分?jǐn)?shù))總分,cast(avg(分?jǐn)?shù)*1.0)AS DECIMAL(18,2))平均分FROM tbGROUP BY 姓名2、使用SQL Server 2000動(dòng)態(tài)SQL
DECLARE @sql VARCHAR(500)SET @sql='select 姓名'SELECT @sql=@sql+',max(case 課程 when '''+課程+''' then 分?jǐn)?shù) else 0 end)['+課程+']'from(SELECT DISTINCT 課程 FROM tb)aSET @sql=@sql+',sum(分?jǐn)?shù)) 總分,cast(avg(分?jǐn)?shù)*1.0) as decimal(18,2)) 平均分 from tb group by 姓名'exec(@sql)3、使用SQL Server 2005靜態(tài)SQL
SELECT m.*,n.總分,n.平均分from(SELECT * FROM tb pivot(max(分?jǐn)?shù))FOR 課程 IN(語文,數(shù)學(xué),物理))a)m,(SELECT 姓名,sum(分?jǐn)?shù)) 總分,cast(avg(分?jǐn)?shù)*1.0)AS DECIMAL(18,2))平均分FROM tbGROUP BY 姓名)nWHERE m.姓名=n.姓名4、使用SQL Server 2005動(dòng)態(tài)SQL
--使用stuff()--DECLARE @sql VARCHAR(8000)SET @sql='' --初始化變量@sqlSELECT @sql=@sql+','+課程 FROM tb GROUP BY 課程 --變量多值賦值--同select @sql = @sql + ','+課程from (select distinct課程from tb)aSET @sql=stuff(@sql,1,1,'')--去掉首個(gè)','SET @sql='select m.* , n.總分,n.平均分 from(select * from (select * from tb) a pivot (max(分?jǐn)?shù)) for 課程 in ('+@sql+')) b) m ,(select 姓名,sum(分?jǐn)?shù)) 總分, cast(avg(分?jǐn)?shù)*1.0) as decimal(18,2))平均分 from tb group by 姓名) nwhere m.姓名= n.姓名'exec(@sql)--或使用isnull()DECLARE @sql VARCHAR(8000)SELECT @sql=isnull(@sql+',','')+課程 FROM tb GROUP BY 課程SET @sql='select m.* , n.總分, n.平均分 from(select * from (select * from tb) a pivot (max(分?jǐn)?shù)) for 課程 in ('+@sql+')) b) m ,(select 姓名,sum(分?jǐn)?shù))總分, cast(avg(分?jǐn)?shù)*1.0) as decimal(18,2))平均分 from tb group by 姓名) nwhere m.姓名= n.姓名'exec(@sql)五、列轉(zhuǎn)行
1、建立表格
IF OBJECT_ID('tb')IS NOT NULL DROP TABLE tbgoCREATE TABLE tb(姓名 VARCHAR(10),語文 INT,數(shù)學(xué) INT,物理 INT)INSERT INTO tb VALUES('張三',74,83,93)INSERT INTO tb VALUES('李四',74,84,94)goSELECT * FROM tbgo2、使用SQL Server 2000靜態(tài)SQL
--SQL SERVER 2000靜態(tài)SQL。SELECT * FROM(SELECT 姓名,課程='語文',分?jǐn)?shù)=語文 FROM tbUNION ALLSELECT 姓名,課程='數(shù)學(xué)',分?jǐn)?shù)=數(shù)學(xué) FROM tbUNION ALLSELECT 姓名,課程='物理',分?jǐn)?shù)=物理 FROM tb) tORDER BY 姓名,CASE 課程 WHEN '語文' THEN 1 WHEN '數(shù)學(xué)' THEN 2 WHEN '物理' THEN 3 end2、使用SQL Server 2000動(dòng)態(tài)SQL
--SQL SERVER 2000動(dòng)態(tài)SQL。--調(diào)用系統(tǒng)表動(dòng)態(tài)生態(tài)。DECLARE @sql VARCHAR(8000)SELECT @sql=isnull(@sql+' union all ','')+' select 姓名, [課程]='+quotename(Name,'''')+' , [分?jǐn)?shù)] = '+quotename(Name)+' from tb'FROM syscolumnsWHERE Name!='姓名' AND ID=object_id('tb')--表名tb,不包含列名為姓名的其他列ORDER BY colidexec(@sql+' order by 姓名')go3、使用SQL Server 2005靜態(tài)SQL
--SQL SERVER 2005動(dòng)態(tài)SQLSELECT 姓名,課程,分?jǐn)?shù) FROM tb unpivot (分?jǐn)?shù) FOR 課程 IN([語文],[數(shù)學(xué)],[物理])) t4、使用SQL Server 2005動(dòng)態(tài)SQL
--SQL SERVER 2005動(dòng)態(tài)SQLDECLARE @sql NVARCHAR(4000)SELECT @sql=isnull(@sql+',','')+quotename(Name)FROM syscolumnsWHERE ID=object_id('tb')AND Name NOT IN('姓名')ORDER BY ColidSET @sql='select 姓名,[課程],[分?jǐn)?shù)] from tb unpivot ([分?jǐn)?shù)] for [課程] in('+@sql+'))b'exec(@sql)轉(zhuǎn)自:http://www.cnblogs.com/zhangzt/archive/2010/07/29/1787825.html
總結(jié)
以上是生活随笔為你收集整理的SQL Server 行转列,列转行。多行转成一列的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 国六标准对汽车行业有哪些影响?
- 下一篇: 数据库数据格式化之Kettle Spoo