SQL Server 行转列,列转行。多行转成一列
生活随笔
收集整理的這篇文章主要介紹了
SQL Server 行转列,列转行。多行转成一列
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、多行轉成一列(并以","隔開)
表名:A
表數據:
想要的查詢結果:
查詢語句:
SELECT name ,value = ( STUFF(( SELECT ',' + valueFROM AWHERE name = Test.nameFORXML PATH('')), 1, 1, '') ) FROM A AS Test GROUP BY name;PS:STUFF語句就是為了去掉第一個【逗號】
附STUFF用法:(從原字符的第二個開始共三個字符替換為后面的字符)
SELECT STUFF('abcdef', 2, 3, 'ijklmn');查詢結果:aijklmnef
?二、一列轉成多行
表名:tb
表數據:
想要的結果:
查詢語句:
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?三、行轉列(轉自大神張志濤的博客 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),分數 INT)INSERT INTO tb VALUES('張三','語文',74)INSERT INTO tb VALUES('張三','數學',83)INSERT INTO tb VALUES('張三','物理',93)INSERT INTO tb VALUES('李四','語文',74)INSERT INTO tb VALUES('李四','數學',84)INSERT INTO tb VALUES('李四','物理',94)goSELECT * FROM tb2、使用SQL Server 2000靜態SQL
SELECT 姓名,max(CASE 課程 WHEN '語文' THEN 分數 ELSE 0 end)語文,max(CASE 課程 WHEN '數學' THEN 分數 ELSE 0 end)數學,max(CASE 課程 WHEN '物理' THEN 分數 ELSE 0 end)物理FROM tbGROUP BY 姓名3、使用SQL Server 2005靜態SQL
SELECT * FROM tb PIVOT( MAX(分數) FOR 課程 IN ( 語文, 數學, 物理 ) ) a;4、使用SQL Server 2005動態SQL
--使用stuff()DECLARE @sql VARCHAR(8000)SET @sql='' --初始化變量@sqlSELECT @sql=@sql+','+課程 FROM tb GROUP BY 課程 --變量多值賦值SET @sql=stuff(@sql,1,1,'')--去掉首個','SET @sql='select * from tb pivot (max(分數) 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(分數) for 課程 in ('+@sql+'))a'exec(@sql)四、行轉列結果加上總分、平均分
1、使用SQL Server 2000靜態SQL
SELECT 姓名,max(CASE 課程 WHEN '語文' THEN 分數 ELSE 0 end)語文,max(CASE 課程 WHEN '數學' THEN 分數 ELSE 0 end)數學,max(CASE 課程 WHEN '物理' THEN 分數 ELSE 0 end)物理,sum(分數)總分,cast(avg(分數*1.0)AS DECIMAL(18,2))平均分FROM tbGROUP BY 姓名2、使用SQL Server 2000動態SQL
DECLARE @sql VARCHAR(500)SET @sql='select 姓名'SELECT @sql=@sql+',max(case 課程 when '''+課程+''' then 分數 else 0 end)['+課程+']'from(SELECT DISTINCT 課程 FROM tb)aSET @sql=@sql+',sum(分數) 總分,cast(avg(分數*1.0) as decimal(18,2)) 平均分 from tb group by 姓名'exec(@sql)3、使用SQL Server 2005靜態SQL
SELECT m.*,n.總分,n.平均分from(SELECT * FROM tb pivot(max(分數)FOR 課程 IN(語文,數學,物理))a)m,(SELECT 姓名,sum(分數) 總分,cast(avg(分數*1.0)AS DECIMAL(18,2))平均分FROM tbGROUP BY 姓名)nWHERE m.姓名=n.姓名4、使用SQL Server 2005動態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,'')--去掉首個','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+',','')+課程 FROM tb GROUP 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)五、列轉行
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 tbgo2、使用SQL Server 2000靜態SQL
--SQL SERVER 2000靜態SQL。SELECT * FROM(SELECT 姓名,課程='語文',分數=語文 FROM tbUNION ALLSELECT 姓名,課程='數學',分數=數學 FROM tbUNION ALLSELECT 姓名,課程='物理',分數=物理 FROM tb) tORDER BY 姓名,CASE 課程 WHEN '語文' THEN 1 WHEN '數學' THEN 2 WHEN '物理' THEN 3 end2、使用SQL Server 2000動態SQL
--SQL SERVER 2000動態SQL。--調用系統表動態生態。DECLARE @sql VARCHAR(8000)SELECT @sql=isnull(@sql+' union all ','')+' select 姓名, [課程]='+quotename(Name,'''')+' , [分數] = '+quotename(Name)+' from tb'FROM syscolumnsWHERE Name!='姓名' AND ID=object_id('tb')--表名tb,不包含列名為姓名的其他列ORDER BY colidexec(@sql+' order by 姓名')go3、使用SQL Server 2005靜態SQL
--SQL SERVER 2005動態SQLSELECT 姓名,課程,分數 FROM tb unpivot (分數 FOR 課程 IN([語文],[數學],[物理])) t4、使用SQL Server 2005動態SQL
--SQL SERVER 2005動態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 姓名,[課程],[分數] from tb unpivot ([分數] for [課程] in('+@sql+'))b'exec(@sql)轉自:http://www.cnblogs.com/zhangzt/archive/2010/07/29/1787825.html
總結
以上是生活随笔為你收集整理的SQL Server 行转列,列转行。多行转成一列的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 国六标准对汽车行业有哪些影响?
- 下一篇: 支付宝网商银行有什么用