数据库横表纵表相互转化
环境: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;
记录自己的学习点滴,与君共勉。
浙公网安备 33010602011771号