欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

DB2 纵横表转换

程序员文章站 2023-12-26 17:57:21
...

普通行列转换:

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

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

相关标签: DB2 纵表 横表

上一篇:

下一篇: