行列轉換:
[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...