目录

  • 行转列
  • 方法一:Oracle中的Pivot函数
  • 方法二:聚合函数(max)结合decode函数
  • 方法三:使用聚合函数(max)结合case when 函数
  • 列转行
  • 方法一:Oracle中的unpivot函数
  • 方法二:使用union all方法


行转列

方法一:Oracle中的Pivot函数

说明:pivot(聚合函数 for 列名 in(类型)),其中 in(‘’) 中可以指定别名,in中还可以指定子查询,比如 select distinct ranking from temp

SELECT * FROM [StudentScores] /*数据源*/
AS P
PIVOT 
(
    SUM(Score/*行转列后 列的值*/) FOR 
    p.Subject/*需要行转列的列*/ IN ([语文],[数学],[英语],[生物]/*列的值*/)
) AS T

示例代码:

with temp as(
select '四川省' nation ,'成都市' city,'第一' ranking from dual union all
select '四川省' nation ,'绵阳市' city,'第二' ranking from dual union all
select '四川省' nation ,'德阳市' city,'第三' ranking from dual union all
select '四川省' nation ,'宜宾市' city,'第四' ranking from dual union all
select '湖北省' nation ,'武汉市' city,'第一' ranking from dual union all
select '湖北省' nation ,'宜昌市' city,'第二' ranking from dual union all
select '湖北省' nation ,'襄阳市' city,'第三' ranking from dual
)
select * from (select nation,city,ranking from temp)
pivot (max(city) for ranking in ('第一' as 第一,'第二' AS 第二,'第三' AS 第三,'第四' AS 第四));

结果

postgresql 的列转行_ci

方法二:聚合函数(max)结合decode函数

说明:decode的用法:decode(条件,值1,返回值1,值2,返回值2,…值n,返回值n,缺省值)

该函数的含义如下:

IF 条件=值1 THEN
    RETURN(翻译值1)
ELSIF 条件=值2 THEN
    RETURN(翻译值2)
    ......
ELSIF 条件=值n THEN
    RETURN(翻译值n)
ELSE
    RETURN(缺省值)
END IF

示例代码:

with temp as(
select '四川省' nation ,'成都市' city,'第一' ranking from dual union all
select '四川省' nation ,'绵阳市' city,'第二' ranking from dual union all
select '四川省' nation ,'德阳市' city,'第三' ranking from dual union all
select '四川省' nation ,'宜宾市' city,'第四' ranking from dual union all
select '湖北省' nation ,'武汉市' city,'第一' ranking from dual union all
select '湖北省' nation ,'宜昌市' city,'第二' ranking from dual union all
select '湖北省' nation ,'襄阳市' city,'第三' ranking from dual
)
select nation,
max(decode(ranking, '第一', city, '')) as 第一,
max(decode(ranking, '第二', city, '')) as 第二,
max(decode(ranking, '第三', city, '')) as 第三,
max(decode(ranking, '第四', city, '')) as 第四
from temp group by nation;

postgresql 的列转行_聚合函数_02

方法三:使用聚合函数(max)结合case when 函数
with temp as(
select '四川省' nation ,'成都市' city,'第一' ranking from dual union all
select '四川省' nation ,'绵阳市' city,'第二' ranking from dual union all
select '四川省' nation ,'德阳市' city,'第三' ranking from dual union all
select '四川省' nation ,'宜宾市' city,'第四' ranking from dual union all
select '湖北省' nation ,'武汉市' city,'第一' ranking from dual union all
select '湖北省' nation ,'宜昌市' city,'第二' ranking from dual union all
select '湖北省' nation ,'襄阳市' city,'第三' ranking from dual
)
select 
       case when nation='湖北省' then '湖北省1'
            when nation='四川省' then '四川省1'
       else null
       end as "省份",
       max(
           case when ranking='第一' then city else null end 
       ) as "第一",
       max(
           case when ranking='第二' then city else null end 
       ) as "第二",
       max(
           case when ranking='第三' then city else null end 
       ) as "第三",
       max(
           case when ranking='第四' then city else null end 
       ) as "第四"
from temp
group by 
      case when nation='湖北省' then '湖北省1'
            when nation='四川省' then '四川省1'
       else null
       end;

postgresql 的列转行_postgresql 的列转行_03

列转行

方法一:Oracle中的unpivot函数

说明:unpivot(自定义列名/列的值/ for 自定义列名/列名/ in(列名))

with temp as(
select '四川省' nation ,'成都市' 第一,'绵阳市' 第二,'德阳市' 第三,'宜宾市' 第四  from dual union all
select '湖北省' nation ,'武汉市' 第一,'宜昌市' 第二,'襄阳市' 第三,'' 第四   from dual
)
select nation,name,title from temp
unpivot
(name for title in (第一,第二,第三,第四))t

postgresql 的列转行_行转列_04

方法二:使用union all方法
with temp as(
select '四川省' nation ,'成都市' 第一,'绵阳市' 第二,'德阳市' 第三,'宜宾市' 第四  from dual union all
select '湖北省' nation ,'武汉市' 第一,'宜昌市' 第二,'襄阳市' 第三,'' 第四   from dual
)
select nation,第一 as ranking,'第一' as title from temp 
union all
select nation,第二 as ranking,'第二' as title from temp
union all
select nation,第三 as ranking,'第三' as title from temp
order by 
      nation,title desc

postgresql 的列转行_ci_05