sql server行列轉化和行列置換

2021-09-07 05:07:23 字數 3624 閱讀 9805

行列轉換:  

[sql]view plain

copy

姓名 課程 分數  

張三 語文 74  

張三 數學 83  

張三 物理 93  

李四 語文 74  

李四 數學 84  

李四 物理 94  

想變成(得到如下結果):   

姓名 語文 數學 物理   

---- ---- ---- ----  

李四 74   84   94  

張三 74   83   93  

create table sc(姓名 varchar(10),課程 varchar(10),分數 float)  

insert into sc  

select '張三','語文',74  

union  

select '張三','數學',83  

union  

select '張三','物理',93  

union  

select '李四','語文',74  

union  

select '李四','數學',84  

union  

select '李四','物理',94  

方法1:  

declare @sql varchar(max)  

set @sql='select '  

select @sql=@sql+', max(case when 課程='''+課程+''' then 分數 else '''' end)['+課程+']' from (select distinct 課程 from sc)t  

set @sql = stuff(@sql,8,1,'')  

print @sql  

set @sql=@sql+' ,姓名 from sc group by 姓名'  

exec(@sql)  

方法2:  

select 姓名,數學,物理,語文 from sc pivot( max(分數) for 課程 in(數學,物理,語文))t  

方法3:  

declare @sql varchar(8000)  

select @sql = isnull(@sql + '],[' , '') + 課程 from sc group by 課程  

print @sql  

set @sql = '[' + @sql + ']'  

exec ('select * from (select * from tb) a pivot (max(分數) for 課程 in (' + @sql + ')) b')  

行列置換:

[sql]view plain

copy

姓名  語文  數學   物理  

----------------------------------  

張三  80     90    85  

李四  85     92    82  

要求使用t-sql語言實現以下結果:  

課程  張三  李四  

----------------------  

語文  80    85  

數學  90    92  

物理  85    82  

drop table sc  

create table sc(姓名 varchar(10),語文 int,數學 int,物理 int)  

insert into sc  

select '張三',80,90,85  

union all  

select '李四',85,92,82  

select * from sc  

-------------這個過程不就是unpivot,有時間再補充?  

select * into sc1 from(  

select 姓名,'語文' 課程,語文 分數 from sc  

union  

select 姓名,'數學' 課程,數學 from sc  

union  

select 姓名,'物理' 課程,物理 from sc  

)t  

[sql]view plain

copy

補充unpivot,和上面操作時同樣的效果  

[sql]view plain

copy

select  姓名,課程,分數 into #sc1 from sc unpivot(分數 for 課程 in([語文],[數學],[物理]))a  

[sql]view plain

copy

[sql]view plain

copy

declare @sql varchar(8000)  

set @sql='select '  

select @sql=@sql+', max(case when 姓名='''+姓名+''' then 分數 else ''''end)['+姓名+']' from (select distinct 姓名 from   

sc1)t  

set @sql=stuff(@sql,8,1,'')  

set @sql=@sql+' ,課程 from sc1 group by 課程'  

print @sql  

exec(@sql)  

[sql]view plain

copy

[sql]view plain

copy

補充動態pivot和unpiot  

[sql]view plain

copy

--------------pivot  

declare @sql varchar(8000)  

select @sql = isnull(@sql + '],[' , '') + 課程 from tb group by 課程  

print @sql  

set @sql = '[' + @sql + ']'  

exec ('select *  from (select * from tb) a pivot (max(分數) for 課程 in (' + @sql + ')) b')  

--------------unpivot  

declare @sql varchar(8000)  

select @sql = isnull(@sql + '],[' , '') + name from syscolumns where id=object_id('tb') and colorder>1  

set @sql = '[' + @sql + ']'  

exec ('select 姓名,課程,分數 from (select * from tbtb) a unpivot (分數 for 課程 in (' + @sql + ')) b') 

sqlServer 行列轉換之多行轉一行

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

SQL Server行列轉換

行列轉換應該非常廣泛,也就是常說的交叉表,範例如下 注意事項 資料庫相容性級別 sql server 2005 90 建立臨時測試表 create table test 姓名 varchar 10 課程 varchar 10 分數 int insert into test values 張三 語文 ...

SQL Server 行列轉換

報表顯示需求,查詢結果往往需要做一些行列轉換或列行轉換來顯示。就以這個例子的資料來源做演示。正常查詢結果顯示和執行結果,如下 下面演示,把 rid 和 dt 作為列顯示 view code select rid sum case when dt 2011 01 23 then hits end as...