数据库横表纵表相互转化

环境:oracle 11g  pl/sql

 

横纵表相互转化

 

项目中有时候会用到把纵表转化成横表,或是横表转化成纵表,以下是我在请教别人和自己思考后想到的方法。以下提供一个小实例,供大家参考。

 

纵表转横表

1、纵表如下:

 

说明:共有四个城市,和四个项目,每个城市最多有四个项目。

2、转化成横表如下:

 

Sql:

select project,

    sum(case city when '唐山市' then value else 0 end ) 唐山市,

    sum(case city when '沧州市' then value else 0 end ) 沧州市,

    sum(case city when '承德市' then value else 0 end ) 承德市,

    sum(case city when '保定市' then value else 0 end ) 保定市

from portrait

     group by project

     order by project;

说明:sum函数使用主要是因为group by 的原因,其实上述语句的每一个单元格只会查出一条数据,用sum函数不会对结果产生影响。

横表转纵表

1、横表如下:(就是上面的纵表转横表的结果)

 

2、转化成纵表(最初的纵表)

 

Sql:

select '唐山市' city,project,唐山市 value from transverse where 唐山市>0 union all

select '沧州市' city,project,沧州市 value from transverse where 沧州市>0 union all

select '承德市' city,project,承德市 value from transverse where 承德市>0 union all

select '保定市' city,project,保定市 value from transverse where 保定市>0 ;

 

说明:'唐山市',带单引号的表示字符串,唐山市,不带单引号的表示列名,大家注意下,列名最好不要这样起成中文。

 

 

纵表转横表,有字符串类型的数据

解决办法:sum函数改为max/min

MAX()和MIN()函数不仅可以作用于数值型数据,也可以作用于字符串或是日期时间数据类型的数据。

1、纵表如下:

 

说明:Value_1 是varchar2类型

2、转化成横表

 

Sql:

select project,

    max(case city when '唐山市' then value_1 else '' end ) 唐山市,

    max(case city when '沧州市' then value_1 else '' end ) 沧州市,

    max(case city when '承德市' then value_1 else '' end ) 承德市,

    max(case city when '保定市' then value_1 else '' end ) 保定市

from portrait

     group by project

     order by project;

 

记录自己的学习点滴,与君共勉。

posted on 2017-07-02 16:14  坚持的人  阅读(1431)  评论(0)    收藏  举报

导航