日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

SQL Server 行转列,列转行。多行转成一列

發布時間:2024/9/20 数据库 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 tb

2、使用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 tbgo

2、使用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 end

2、使用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 姓名')go

3、使用SQL Server 2005靜態SQL

--SQL SERVER 2005動態SQLSELECT 姓名,課程,分數 FROM tb unpivot (分數 FOR 課程 IN([語文],[數學],[物理])) t

4、使用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 行转列,列转行。多行转成一列的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。