普通行列转换

原创 2007年11月22日 16:56:00

/*
普通行列转换(2007-11-18于海南三亚)

假设有张学生成绩表(tb)如下:
Name Subject Result
张三 语文  74
张三 数学  83
张三 物理  93
李四 语文  74
李四 数学  84
李四 物理  94
*/

-------------------------------------------------------------------------
/*

想变成
姓名         语文        数学        物理         
---------- ----------- ----------- -----------
李四         74          84          94
张三         74          83          93
*/

create table tb
(
   Name   
varchar(10) ,
   Subject
varchar(10) ,
   Result 
int
)

insert into tb(Name , Subject , Result) values('张三' , '语文' , 74)
insert into tb(Name , Subject , Result) values('张三' , '数学' , 83)
insert into tb(Name , Subject , Result) values('张三' , '物理' , 93)
insert into tb(Name , Subject , Result) values('李四' , '语文' , 74)
insert into tb(Name , Subject , Result) values('李四' , '数学' , 84)
insert into tb(Name , Subject , Result) values('李四' , '物理' , 94)
go

--静态SQL,指subject只有语文、数学、物理这三门课程。
select name 姓名,
 
max(case subject when '语文' then result else 0 end) 语文,
 
max(case subject when '数学' then result else 0 end) 数学,
 
max(case subject when '物理' then result else 0 end) 物理
from tb
group by name
/*
姓名         语文        数学        物理         
---------- ----------- ----------- -----------
李四         74          84          94
张三         74          83          93
*/

--动态SQL,指subject不止语文、数学、物理这三门课程。
declare @sql varchar(8000)
set @sql = 'select Name as ' + '姓名'
select @sql = @sql + ' , max(case Subject when ''' + Subject + ''' then Result else 0 end) [' + Subject + ']'
from (select distinct Subject from tb) as a
set @sql = @sql + ' from tb group by name'
exec(@sql)
/*
姓名         数学        物理        语文         
---------- ----------- ----------- -----------
李四         84          94          74
张三         83          93          74
*/

-------------------------------------------------------------------
/*
加个平均分,总分
姓名         语文        数学        物理        平均分                总分         
---------- ----------- ----------- ----------- -------------------- -----------
李四         74          84          94          84.00                252
张三         74          83          93          83.33                250
*/

--静态SQL,指subject只有语文、数学、物理这三门课程。
select name 姓名,
 
max(case subject when '语文' then result else 0 end) 语文,
 
max(case subject when '数学' then result else 0 end) 数学,
 
max(case subject when '物理' then result else 0 end) 物理,
 
cast(avg(result*1.0) as decimal(18,2)) 平均分,
 
sum(result) 总分
from tb
group by name
/*
姓名         语文        数学        物理        平均分                总分         
---------- ----------- ----------- ----------- -------------------- -----------
李四         74          84          94          84.00                252
张三         74          83          93          83.33                250
*/

--动态SQL,指subject不止语文、数学、物理这三门课程。
declare @sql1 varchar(8000)
set @sql1 = 'select Name as ' + '姓名'
select @sql1 = @sql1 + ' , max(case Subject when ''' + Subject + ''' then Result else 0 end) [' + Subject + ']'
from (select distinct Subject from tb) as a
set @sql1 = @sql1 + ' , cast(avg(result*1.0) as decimal(18,2)) 平均分,sum(result) 总分 from tb group by name'
exec(@sql1)
/*
姓名         数学        物理        语文        平均分                总分         
---------- ----------- ----------- ----------- -------------------- -----------
李四         84          94          74          84.00                252
张三         83          93          74          83.33                250
*/

drop table tb   

---------------------------------------------------------
--
-------------------------------------------------------
/*

如果上述两表互相换一下:即

姓名 语文 数学 物理
张三 74  83  93
李四 74  84  94

想变成
Name       Subject Result     
---------- ------- -----------
李四         语文      74
李四         数学      84
李四         物理      94
张三         语文      74
张三         数学      83
张三         物理      93
*/

create table tb1
(
   姓名
varchar(10) ,
   语文
int ,
   数学
int ,
   物理
int
)

insert into tb1(姓名 , 语文 , 数学 , 物理) values('张三',74,83,93)
insert into tb1(姓名 , 语文 , 数学 , 物理) values('李四',74,84,94)

select * from
(
 
select 姓名 as Name , Subject = '语文' , Result = 语文 from tb1
 
union all
 
select 姓名 as Name , Subject = '数学' , Result = 数学 from tb1
 
union all
 
select 姓名 as Name , Subject = '物理' , Result = 物理 from tb1
) t
order by name , case Subject when '语文' then 1 when '数学' then 2 when '物理' then 3 when '总分' then 4 end

--------------------------------------------------------------------
/*
加个平均分,总分
Name       Subject     Result              
---------- -------    --------------------
李四         语文      74.00
李四         数学      84.00
李四         物理      94.00
李四         平均分    84.00
李四         总分      252.00
张三         语文      74.00
张三         数学      83.00
张三         物理      93.00
张三         平均分    83.33
张三         总分      250.00
*/

select * from
(
 
select 姓名 as Name , Subject = '语文' , Result = 语文 from tb1
 
union all
 
select 姓名 as Name , Subject = '数学' , Result = 数学 from tb1
 
union all
 
select 姓名 as Name , Subject = '物理' , Result = 物理 from tb1
 
union all
 
select 姓名 as Name , Subject = '平均分' , Result = cast((语文 + 数学 + 物理)*1.0/3 as decimal(18,2)) from tb1
 
union all
 
select 姓名 as Name , Subject = '总分' , Result = 语文 + 数学 + 物理 from tb1
) t
order by name , case Subject when '语文' then 1 when '数学' then 2 when '物理' then 3 when '平均分' then 4 when '总分' then 5 end

drop table tb1

标题:普通行列转换(version 2.0) 作者:爱新觉罗.毓华(十八年风雨,守得冰山雪莲花开)

/*标题:普通行列转换(version 2.0)作者:爱新觉罗.毓华(十八年风雨,守得冰山雪莲花开)时间:2008-03-09地点:广东深圳说明:普通行列转换(version 1.0)仅针对sql s...
  • ajaxchen_615
  • ajaxchen_615
  • 2009年02月27日 11:00
  • 1955

行列转换--普通

/*行列转换--普通*/if exists (select * from sysobjects where id=object_id(a) and sysstat & 0xf = 3)  drop t...
  • ls_cd
  • ls_cd
  • 2007年11月27日 14:26
  • 147

普通行列转换

 /*标题:普通行列转换(version 2.0)作者:爱新觉罗.毓华 时间:2008-03-09地点:广东深圳说明:普通行列转换(version 1.0)仅针对sql server 2000提供静态...
  • wxg22526451
  • wxg22526451
  • 2008年09月08日 10:40
  • 446

普通行列转换(version 2.0)

/*标题:普通行列转换(version 2.0)作者:爱新觉罗.毓华 时间:2008-03-09地点:广东深圳说明:普通行列转换(version 1.0)仅针对sql server 2000提供静态和...
  • nolast02
  • nolast02
  • 2008年05月13日 12:01
  • 213

sql 普通行列转换

标题:普通行列转换(version 2.0) 作者:爱新觉罗.毓华(十八年风雨,守得冰山雪莲花开) 时间:2008-03-09 地点:广东深圳 说明:普通行列转换(version 1.0)仅针...
  • xgq07
  • xgq07
  • 2011年02月14日 18:15
  • 1227

SQL普通行列转换

SQL code/* 普通行列转换 假设有张学生成绩表(tb)如下: Name Subject Result 张三 语文  74 张三 数学  83 张三 物理  93 李四 语文  7...
  • koeleven
  • koeleven
  • 2012年06月28日 09:28
  • 627

普通行列转换大全集锦

Daiyueqiang 休闲所地,茶一杯。 数据库优化 数据库基础 数据仓库 添加文章       首页    博问    闪存        订阅     管理     p...
  • niudun6666
  • niudun6666
  • 2014年02月10日 11:52
  • 429

oracle行列转换

1、多行转换单列字符串 比如:   需要转换成: 1    b,z,x 2    c,x 写法1:        SELECT t.rank ,max(substr(sys_connect_by_p...
  • u011750989
  • u011750989
  • 2013年09月18日 10:10
  • 2110

sql实现行列转换

postgresql 现有一个表如(表一)想要转换为(表二) sql:select stuName as 姓名,chinese as 语文,math as 数学,english as 英文 from...
  • ECHOutopia
  • ECHOutopia
  • 2014年10月28日 11:02
  • 2853

Ms SQL中 普通行列转换

*标题:普通行列转换(version 2.0)时间:2008-03-09地点:广东深圳说明:普通行列转换(version 1.0)仅针对sql server 2000提供静态和动态写法,version...
  • IBM_hoojo
  • IBM_hoojo
  • 2010年06月05日 17:32
  • 1182
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:普通行列转换
举报原因:
原因补充:

(最多只允许输入30个字)