- 行列轉換:
- 姓名 課程 分數
- 張三 語文 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')
行列置換:
- 姓名 語文 數學 物理
- ----------------------------------
- 張三 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
- 補充unpivot,和上面操作時同樣的效果
- select 姓名,課程,分數 into #sc1 from sc unpivot(分數 for 課程 in([語文],[數學],[物理]))a
- 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)
- 補充動態pivot和unpiot
- --------------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')