Sql server 中將資料行轉列列轉行(二)

2022-08-23 08:21:09 字數 3459 閱讀 8954

/*

第一步:建立臨時表結構

*/create table #student --建立臨時表

( stuname nvarchar(20), --學生名稱

chinese int,

math int,

english int

)drop table #student --刪除臨時表

select * from #student --查詢所有資料

insert into #student(stuname,chinese,math,english) values('張三',70,86,96);

insert into #student(stuname,chinese,math,english) values('李四',49,85,86);

insert into #student(stuname,chinese,math,english) values('王五',59,58,90);

insert into #student(stuname,chinese,math,english) values('趙六',68,79,80);

一:列,下面是轉換之前與之後的截圖對比

方法一:使用 union all 拼接多個結果集

select * from (

select stuname,課程='語文',分數=chinese from #student

union all

select stuname,課程='數學',分數=math from #student

union all

select stuname,課程='英語',分數=english from #student

)as te

order by te.stuname asc

select *

from #student

unpivot (分數 for 課程 in([chinese],math,english)) t

會有動態的情況,但是在處理列轉行的情況時,一般每個資料庫在進行資料儲存的時候,列有多少個,都是已經確定的,不存在不確定性,

所以,第三種方法知道就可以了,實用性不大,不推薦此方法。

declare @sql nvarchar(4000)

select @sql=isnull(@sql+',','')+quotename(name)

from syscolumns

where id=object_id('student')

and name not in('stuname') --不顯示學生名稱列

order by colid

--print @sql

set @sql='

select *

from #student

unpivot (分數 for 課程 in('+@sql+')) t

'exec(@sql)

注意:上面的這一部分,由於查詢了syscolumns 資料庫內建系統表,我演示的資料是臨時表,是查不到任何資料的,必須建立實際的資料庫表才可以使用。

/*

第一步:建立臨時表結構

*/create table #student --建立臨時表

( stuname nvarchar(20), --學生名稱

chinese int,

math int,

english int

)drop table #student --刪除臨時表

select * from #student --查詢所有資料

insert into #student(stuname,chinese,math,english) values('張三',70,86,96);

insert into #student(stuname,chinese,math,english) values('李四',49,85,86);

insert into #student(stuname,chinese,math,english) values('王五',59,58,90);

insert into #student(stuname,chinese,math,english) values('趙六',68,79,80);

一:列,下面是轉換之前與之後的截圖對比

方法一:使用 union all 拼接多個結果集

select * from (

select stuname,課程='語文',分數=chinese from #student

union all

select stuname,課程='數學',分數=math from #student

union all

select stuname,課程='英語',分數=english from #student

)as te

order by te.stuname asc

select *

from #student

unpivot (分數 for 課程 in([chinese],math,english)) t

會有動態的情況,但是在處理列轉行的情況時,一般每個資料庫在進行資料儲存的時候,列有多少個,都是已經確定的,不存在不確定性,

所以,第三種方法知道就可以了,實用性不大,不推薦此方法。

declare @sql nvarchar(4000)

select @sql=isnull(@sql+',','')+quotename(name)

from syscolumns

where id=object_id('student')

and name not in('stuname') --不顯示學生名稱列

order by colid

--print @sql

set @sql='

select *

from #student

unpivot (分數 for 課程 in('+@sql+')) t

'exec(@sql)

注意:上面的這一部分,由於查詢了syscolumns 資料庫內建系統表,我演示的資料是臨時表,是查不到任何資料的,必須建立實際的資料庫表才可以使用。

Oracle 資料轉sql server資料

首先使用oracle deverloper,在編輯裡面的dll獲取建立表結構 複製到sql中列名是我們需要的,列的型別是sql不認得,所以我們需要把型別做下轉換 然後執行建立就好了 第二步是把匯出得資料放到sql中,右鍵匯出資料就好了,先換使用者名稱然後時間,時間需要注意to date 03 9月 ...

sqlServer 行列轉換之多行轉一行

記得在剛進專案組時候,使用oracle資料庫,遇到的第乙個難題就是行列轉換,哈哈,真是菜的一bi,現在使用sqlserver資料庫,又遇到了,記錄一下,以備後用和幫助後來者。言歸正傳 資料庫 sqlserver2008r2 英文版 1.建表 學生表 姓名,學科,成績 create table tes...

mysql中將一行轉化為多行資料

之前在網上搜尋了很多關於這個問題的解答方式,基本都是使用substring index和mysql.help topic搭配使用,方法沒錯,但是使用後發現執行時間太長,因此就放棄使用網上推薦的方法。可以使用substring index和union all搭配使用 圖1 圖2 將圖1變為圖2,可以這...