码迷,mamicode.com
首页 > 数据库 > 详细

纵表转横表(SQL)

时间:2015-08-06 17:06:14      阅读:152      评论:0      收藏:0      [点我收藏+]

标签:

/*
普通行列转换
(爱新觉罗.毓华 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  end ) 语文,
   max ( case  subject  when  ‘数学‘  then  result  else  end ) 数学,
   max ( case  subject  when  ‘物理‘  then  result  else  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  end ) 语文,
   max ( case  subject  when  ‘数学‘  then  result  else  end ) 数学,
   max ( case  subject  when  ‘物理‘  then  result  else  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  when  ‘数学‘  then  when  ‘物理‘  then  when  ‘总分‘  then  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  when  ‘数学‘  then  when  ‘物理‘  then  when  ‘平均分‘  then  when  ‘总分‘  then  end
 
drop  table  tb1


纵表转横表(SQL)

标签:

原文地址:http://my.oschina.net/u/582827/blog/488673

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!