一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - Sql Server - sql 普通行列轉換

sql 普通行列轉換

2019-11-07 15:45mssql教程網 Sql Server

說明:普通行列轉換(version 1.0)僅針對sql server 2000提供靜態和動態寫法,version 2.0增加sql server 2005的有關寫法。

問題:假設有張學生成績表(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) 
go 
--SQL SERVER 2000 靜態SQL,指課程只有語文、數學、物理這三門課程。(以下同) 
select 姓名 as 姓名 , 
max(case 課程 when '語文' then 分數 else 0 end) 語文, 
max(case 課程 when '數學' then 分數 else 0 end) 數學, 
max(case 課程 when '物理' then 分數 else 0 end) 物理 
from tb 
group by 姓名 
--SQL SERVER 2000 動態SQL,指課程不止語文、數學、物理這三門課程。(以下同) 
declare @sql varchar(8000) 
set @sql = 'select 姓名 ' 
select @sql = @sql + ' , max(case 課程 when ''' + 課程 + ''' then 分數 else 0 end) [' + 課程 + ']' 
from (select distinct 課程 from tb) as a 
set @sql = @sql + ' from tb group by 姓名' 
exec(@sql) 
--SQL SERVER 2005 靜態SQL。 
select * from (select * from tb) a pivot (max(分數) for 課程 in (語文,數學,物理)) b 
--SQL SERVER 2005 動態SQL。 
declare @sql varchar(8000) 
select @sql = isnull(@sql + '],[' , '') + 課程 from tb group by 課程 
set @sql = '[' + @sql + ']' 
exec ('select * from (select * from tb) a pivot (max(分數) for 課程 in (' + @sql + ')) b') 
--------------------------------- 
/* 
問題:在上述結果的基礎上加平均分,總分,得到如下結果: 
姓名 語文 數學 物理 平均分 總分 
---- ---- ---- ---- ------ ---- 
李四 74 84 94 84.00 252 
張三 74 83 93 83.33 250 
*/ 
--SQL SERVER 2000 靜態SQL。 
select 姓名 姓名, 
max(case 課程 when '語文' then 分數 else 0 end) 語文, 
max(case 課程 when '數學' then 分數 else 0 end) 數學, 
max(case 課程 when '物理' then 分數 else 0 end) 物理, 
cast(avg(分數*1.0) as decimal(18,2)) 平均分, 
sum(分數) 總分 
from tb 
group by 姓名 
--SQL SERVER 2000 動態SQL。 
declare @sql varchar(8000) 
set @sql = 'select 姓名 ' 
select @sql = @sql + ' , max(case 課程 when ''' + 課程 + ''' then 分數 else 0 end) [' + 課程 + ']' 
from (select distinct 課程 from tb) as a 
set @sql = @sql + ' , cast(avg(分數*1.0) as decimal(18,2)) 平均分 , sum(分數) 總分 from tb group by 姓名' 
exec(@sql) 
--SQL SERVER 2005 靜態SQL。 
select m.* , n.平均分 , n.總分 from 
(select * from (select * from tb) a pivot (max(分數) for 課程 in (語文,數學,物理)) b) m, 
(select 姓名 , cast(avg(分數*1.0) as decimal(18,2)) 平均分 , sum(分數) 總分 from tb group by 姓名) n 
where m.姓名 = n.姓名 
--SQL SERVER 2005 動態SQL。 
declare @sql varchar(8000) 
select @sql = isnull(@sql + ',' , '') + 課程 from tb group by 課程 
exec ('select m.* , n.平均分 , n.總分 from 
(select * from (select * from tb) a pivot (max(分數) for 課程 in (' + @sql + ')) b) m , 
(select 姓名 , cast(avg(分數*1.0) as decimal(18,2)) 平均分 , sum(分數) 總分 from tb group by 姓名) n 
where m.姓名 = n.姓名') 
drop table tb 
------------------ 
------------------ 
/* 
問題:如果上述兩表互相換一下:即表結構和數據為: 
姓名 語文 數學 物理 
張三 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) 
go 
--SQL SERVER 2000 靜態SQL。 
select * from 

select 姓名 , 課程 = '語文' , 分數 = 語文 from tb 
union all 
select 姓名 , 課程 = '數學' , 分數 = 數學 from tb 
union all 
select 姓名 , 課程 = '物理' , 分數 = 物理 from tb 
) t 
order by 姓名 , case 課程 when '語文' then 1 when '數學' then 2 when '物理' then 3 end 
--SQL SERVER 2000 動態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 姓名 ') 
--SQL SERVER 2005 動態SQL。 
select 姓名 , 課程 , 分數 from tb unpivot (分數 for 課程 in([語文] , [數學] , [物理])) t 
--SQL SERVER 2005 動態SQL,同SQL SERVER 2000 動態SQL。 
-------------------- 
/* 
問題:在上述的結果上加個平均分,總分,得到如下結果: 
姓名 課程 分數 
---- ------ ------ 
李四 語文 74.00 
李四 數學 84.00 
李四 物理 94.00 
李四 平均分 84.00 
李四 總分 252.00 
張三 語文 74.00 
張三 數學 83.00 
張三 物理 93.00 
張三 平均分 83.33 
張三 總分 250.00 
------------------ 
*/ 
select * from 

select 姓名 as 姓名 , 課程 = '語文' , 分數 = 語文 from tb 
union all 
select 姓名 as 姓名 , 課程 = '數學' , 分數 = 數學 from tb 
union all 
select 姓名 as 姓名 , 課程 = '物理' , 分數 = 物理 from tb 
union all 
select 姓名 as 姓名 , 課程 = '平均分' , 分數 = cast((語文 + 數學 + 物理)*1.0/3 as decimal(18,2)) from tb 
union all 
select 姓名 as 姓名 , 課程 = '總分' , 分數 = 語文 + 數學 + 物理 from tb 
) t 
order by 姓名 , case 課程 when '語文' then 1 when '數學' then 2 when '物理' then 3 when '平均分' then 4 when '總分' then 5 end 
drop table tb

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产精品视频视频久久 | 亚洲国产精品久久卡一 | 国产香蕉视频在线观看 | 男人天堂网页 | 成人永久免费视频 | 国色天香社区视频免费观看3 | 2021福利视频 | 拍拍叫痛的无挡视频免费 | 国内精品视频一区二区三区八戒 | 荷兰艾优apiyoo | 久久观看视频 | 成人丁香乱小说 | 2021国产麻豆剧传媒剧情最新 | 午夜伦理yy44008影院 | 亚洲ss | 国产午夜精品一区二区三区 | 久久热在线视频精品店 | 色综合久久中文字幕 | 91porn最新网址 | 嫩草影院精品视频在线观看 | 亚洲AV精品无码喷水直播间 | 亚洲欧美综合区自拍另类 | ady@ady9.映画网 | 三级黄色片在线免费观看 | 欧美整片在线 | www.男人的天堂 | 99视频免费在线 | 91麻豆国产 | 男同精品视频免费观看网站 | 5151hh四虎国产精品 | 视频在线观看一区二区三区 | 男人j放进女人的p免费看视频 | 驯服有夫之妇HD中字日本 | yw在线观看成人免费 | 欧美亚洲视频在线观看 | 插入逼| a∨79成人网| 成人精品亚洲 | 黑人草 | 亚州vs欧州vs日 | 牧教师在线观看 |