DB2 纵横表转换

普通行列转换:

-------------------------纵表转横表--------------------------------------------

Name Subject Result 
张三 语文  74 
张三 数学  83 
张三 物理  93 
李四 语文  74 
李四 数学  84 
李四 物理  94

 

转换成:

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

<!--EndFragment-->

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

<!--EndFragment-->

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

<!--EndFragment-->

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

<!--EndFragment-->

<!--EndFragment-->

 -------------------------横表转纵表--------------------------------------------

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

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

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 
*/

<!--EndFragment--><!--EndFragment--><!--EndFragment-->

 

<!--EndFragment-->

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

<!--EndFragment-->

<!--EndFragment-->

猜你喜欢

转载自labuladuo.iteye.com/blog/1932119
今日推荐