mysql和oracle的横表与纵表转换

一、Oracle部分:

      

 1、纵表转横表:
                        

       纵表结构 TableA 

Name Course Grade
张三 语文 75
张三 数学 80
张三 英语 90
李四 语文 95 
李四 数学 55

          横表结构 TableB

Name 语文 数学 英语
张三 75 80 90
李四 95 55 0

 转换语句:
      select Name,sum(case Course when ‘语文‘ then Grade else 0 end) as 语文,

                 sum(case Course when ‘数学‘ then Grade else 0 end) as 数学,
                sum(case Course when ‘英语‘ then Grade else 0 end) as 英语  from TableA group by Name
 
   2、横表转纵表的"SQL"示例
                      横表结构: TEST_H2Z
                                ID      姓名    语文        数学       英语      
                                 1       张三     80         90         70            
                                 2       李四     90         85         95          
                                 3       王五     88         75         90          
 
                        转换后的表结构:  
                                 ID     姓名     科目     成绩  
                                  1       张三     语文     80  
                                  2       张三     数学     90  
                                  3       张三     英语     70  
                                  4       李四     语文     90  
                                  5       李四     数学     80    
                                  6       李四     英语     99  
                                  7       王五     语文     85  
                                  8       王五     数学     96  
                                  9       王五     英语     88  
 横表转纵表SQL示例:
             SELECT   姓名,'语文'   AS     科目,语文   AS   成绩   FROM   TEST_H2Z   UNION   ALL 
             SELECT   姓名,'数学'   AS     科目,数学   AS   成绩   FROM   TEST_H2Z   UNION   ALL 
             SELECT   姓名,'英语'   AS     科目,英语   AS   成绩   FROM   TEST_H2Z
              ORDER BY 姓名,科目 DESC;

二、mysql部分:

 1.表tb1有如下数据:

姓名                     语文                        数学                    物理

张三                       68                           89                        99

李四                      90                            66                         78

现在要求写出查询语句得到如下查询结果

name                    subject                       score

张三                       语文                           68
        张三                       数学                           89
        张三                       物理                            99
        李四                       语文                            90
        李四                      数学                            66
        李四                       物理                            78
      sql语句如下:

select 姓名 as name,'语文' as subject,语文 as score from tb1
union
        select 姓名 as name,'数学' as subject,数学 as score from tb1
union
        select 姓名 as name,'物理' as subject,物理 as score from tb1
order by name

或者:

select * from(select 姓名 as name,'语文' as subject,语文 as score from tb1
union
select 姓名 as name,'数学' as subject,数学 as score from tb1
union
select 姓名 as name,'物理' as subject,物理 as score from tb1)tb
order by name

2. tb2表有如下数据:

name              subject                  score

张三               语文                       74
        张三                英语                      88
        张三                物理                       90
        李四                语文                      88
        李四                英语                      67
        李四                物理                        95

通过查询得到如下数据:

姓名         语文                  英语                     物理

张三          74                     88                        90
        李四           88                    67                        95

sql语句如下:

select name as '姓名',
max(case subject when '语文' then score else 0 end) 语文,
        max(case subject when '英语' then score else 0 end) 英语,
        max(case subject when '物理' then score else 0 end)物理
from tb2
group by name

现在要求写出查询语句得到如下结果:

姓名         语文                  英语                     物理            总分                平均分

张三          74                    88                        90                 252                    84
        李四           88                    67                        95                250                    83.33

sql:

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)英语,
sum(result) as 总分,
avg(result) as 平均分
from tb

group by name

 

  

猜你喜欢

转载自my.oschina.net/u/1758234/blog/501375