kettle行转列和列转行的使用_数据库函数 行转列 列转行 原理实现分析以及基础语法实现...

本文详细介绍了如何在Kettle中进行行转列和列转行的操作,包括简单示例、多列表演示及基础语法实现。通过案例展示了行转列与列转行在数据查询中的应用,帮助理解其原理和实现方式。
摘要由CSDN通过智能技术生成

行转列与列转行的操作,在数据查询中还是用得比较多的。可以将列名转换为列值,也可以将列值转换为列名。使相同的数据以多姿态的形式呈现出来,让用户能更直观的感受数据。

行转列:简单表演示

先来看看效果:

这是原表的数据: select * from city3 order by nation,ranking;

60cd95bee45908328a2cc9edc55346de.png

我们将“ranking”列作为列名,“city”列作为列值,开始行转列操作:

语法格式: TABLE_SOURCE

PIVOT(

聚合函数(value_column)

FOR pivot_column

IN(<column_list>)

)

具体实现:select * from city3 pivot (max(city) for ranking in ('第一','第二','第三','第四'));

fd063cc7da89ce8f393eefd23fb1ae2c.png

这样是不是感觉清晰了很多。但这样写只能用于本次查看。如果此时你将这个结果集作为一个内建视图,用于另外的查询。或者直接将这个查询结果新建为一个表,那么就会有新的问题产生。

注意看结果集的列名,'第一' '第二' 。这些列名是包含在“单引号”中的,你在查询时,是无法使用这样的列名的。因为你这么写,数据库会把它当成一个字符串。然后无法匹配你的列,是不是很神奇?

那我们要怎么做呢?我们可以在行转列的时候,为生成的列指定“列别名”。和普通列别名一样,使用as关键字指定即可。

select * from city3 pivot (max(city) for ranking in ('第一' as 第一,'第二' as 第二,'第三' as 第三,'第四' as 第四));

322e4e5dc9fdb437ef6fcc6d3c74e97d.png

多列表演示

下面我们来看看多列的: select * from city order by nation,num;

519f3d6dd7e1aab2a1bd320e7bf69d67.png

采用行转列后:

select * from city pivot (max(city) for ranking in ('第一' as 第一,'第二' as 第二,'第三' as 第三,'第四' as 第四));

bb7c18cffa5a92a0b0950861eacf9613.png

是不是很神奇?看起来有点晕了,其实我们仔细分析就能看出其中的原理:

1.行转列操作的数据只能是2列,一列作为列名,一列作为列值。

2.其他的列都会进行分组操作。有点像group by nation,num;

知道这2个规律了,我们就可以来进行行转列的基础语法实现了。

行转列基础语法实现

分析:其实就是分组函数加上内容选择。

基础语法实现:

select nation,num,

max(case ranking when '第一' then city else null end) as 第一,

max(case ranking when '第二' then city else null end) as 第二,

max(case ranking when '第三' then city else null end) as 第三,

max(case ranking when '第四' then city else null end) as 第四

from city group by nation,num;

我们可以看到,第一,第二,第三,第四几列,都使用了内容选择,并且因为语句使用了group by字句。所以内容选择必须嵌套在组函数中。这也解释了,为什么函数语法中,需要我们加上组函数了。

列转行:简单表演示

列转行,其实就是行专列的逆推导

这是原表的数据: select * from city4;

ac520bae9d724b42df7e0a203783848f.png

我们将列名转换为列值,开始列转行操作

语法格式: TABLE_SOURCE

UNPIVOT(

value_column

FOR pivot_column

IN(<column_list>)

)

具体实现:select * from city4 unpivot (city_name for rank_num in(第一,第二,第三,第四));

注意:这里的列名是匹配具体的列,不能加单引号。

如果之前列转行时,我们没有指定不带单引号的列别名的话,我们将无法完成逆推导。

d4340177ffb5d8ddef559cb66cda34aa.png

这样就将数据还原了回来,生成的列名,其实就是我们参数中给定的名字

多列表演示

下面我们来看看多列的: select * from city2;

f88550bec6cee6b10d225f80ccd3f79a.png

采用列转行后:

select * from city2 unpivot (city_name for rank_num in(第一,第二,第三,第四));

33b189f8089c2c23df433432913a7f50.png

数据同样还原了回来,下面我们来看看基础语法的实现。

列转行基础语法实现

分析:分组函数的逆推导,我们可以查询单个“组”,然后用union来连接结果。

基础语法实现:

select nation,num,'第一' as rank_num,第一 as city_name from city2 where 第一 is not null union

select nation,num,'第二' as rank_num,第二 as city_name from city2 where 第二 is not null union

select nation,num,'第三' as rank_num,第三 as city_name from city2 where 第三 is not null union

select nation,num,'第四' as rank_num,第四 as city_name from city2 where 第四 is not null;

上面我们需要注意,在多列表中,列值可能存在空值,所以我们需要在where字句中,将空值进行过滤

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值