/*
問題:如果上述兩表互相換一下:即表結構和資料為:
姓名 語文 數學 物理
張三 74 83 93
李四 74 84 94
想變成(得到如下結果):
姓名 課程 分數
---- ---- ----
李四 語文 74
李四 數學 84
李四 物理 94
張三 語文 74
張三 數學 83
張三 物理 93
--------------
*/create table tb(姓名 varchar(10) , 語文 int , 數學 int , 物理 int)
insert into tb values('張三',74,83,93)
insert into tb values('李四',74,84,94)
gosql2005或以上:
--sql server 2005 靜態sql。
select 姓名 , 課程 , 分數 from tb unpivot (分數 for 課程 in([語文] , [數學] , [物理])) t
--sql server 2005 動態sql。
declare @sql varchar(8000)
select @sql = isnull(@sql + ' union all ' , '' ) + ' select 姓名 , [課程] = ' + quotename(name , '''') + ' , [分數] = ' + quotename(name) + ' from tb'
from syscolumns
where name! = n'姓名' and id = object_id('tb') --表名tb,不包含列名為姓名的其它列
order by colid asc
exec(@sql + ' order by 姓名 ')
問題:假設有張學生成績表(tb)如下:
姓名 課程 分數
張三 語文 74
張三 數學 83
張三 物理 93
李四 語文 74
李四 數學 84
李四 物理 94
想變成(得到如下結果):
姓名 語文 數學 物理
---- ---- ---- ----
李四 74 84 94
張三 74 83 93
-------------------
*/create 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)
gosql2005或以上:
--sql server 2005 靜態sql。
select * from sales.dbo.tb pivot (max(分數) for 課程 in (語文, 數學,物理))b
--sql server 2005 動態sql。
declare @sql varchar(8000)
select @sql = isnull(@sql + ',' , '') + 課程 from tb group by 課程
exec ('select * from (select * from tb) a pivot (max(分數) for 課程 in (' + @sql + ')) b')
SQL 行列轉換
資料列轉換成行。其中一列需要轉換成行,因為列的值不確定所以用動態執行sql sql物件拼寫出要轉換行的列的值。declare sql varchar 1000 select sql isnull sql advertise name from tbl advertise master select ...
sql行列轉換
1 靜態的行轉列 sql select start dt,max case type name when 總的參與人數 then value end as 總的參與人數 max case type name when 會員參與人數 then value end as 會員參與人數 max case ...
SQL 行列轉換
參考自 表scores 請轉成的橫表是這樣子的 答案 select 姓名,sum case 課程 when 語文 then 分數 else 0 end as 語文,sum case 課程 when 數學 then 分數 else 0 end as 數學,sum case 課程 when 物理 the...