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

來源:互聯網
上載者:User

標籤:title   ima   gpo   轉行   distinct   max   str   png   order   

一、多行轉成一列(並以","隔開)

表名:A

表資料:

想要的查詢結果:

查詢語句:

SELECT  name ,        value = ( STUFF(( SELECT    ‘,‘ + value                          FROM      A                          WHERE     name = Test.name                        FOR                          XML PATH(‘‘)                        ), 1, 1, ‘‘) )FROM    A AS TestGROUP 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) aOUTER 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 @[email protected]+‘,‘+課程 FROM tb GROUP BY 課程 --變數多值賦值SET @sql=stuff(@sql,1,1,‘‘)--去掉首個‘,‘SET @sql=‘select * from tb pivot (max(分數) for 課程 in (‘[email protected]+‘))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 (‘[email protected]+‘))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 @[email protected]+‘,max(case 課程 when ‘‘‘+課程+‘‘‘ then 分數 else 0 end)[‘+課程+‘]‘from(SELECT DISTINCT 課程 FROM tb)aSET @[email protected]+‘,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 @[email protected]+‘,‘+課程 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 (‘[email protected]+‘)) 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 (‘[email protected]+‘)) 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 tb UNION ALL SELECT 姓名,課程=‘數學‘,分數=數學 FROM tb UNION ALL SELECT 姓名,課程=‘物理‘,分數=物理 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(‘[email protected]+‘))b‘exec(@sql)

 

轉自:http://www.cnblogs.com/zhangzt/archive/2010/07/29/1787825.html

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.