SQL 行转列 和 列转行 整理

本文介绍如何使用SQL在不同数据库中实现列转行与行转列的操作。包括Oracle、Spark及MySQL等环境下的具体实现方法。

SQL 列转行 和行转列

列转多行场景:

​ 表中的某个字段是由多个字符串拼接而成,需要按照每个拼接的字符串转换成多行,比如 :【手机品牌】字段里的内容是 小米,华为,苹果;按照这个几个类别进行分组;

原始数据:

ID厂库名称厂库地址手机品牌类型
1手机厂库xxx路xxx街道小米,华为,苹果

目标数据:

ID厂库名称厂库地址手机品牌类型
1手机厂库xxx路xxx街道小米
1手机厂库xxx路xxx街道华为
1手机厂库xxx路xxx街道苹果

ORACLE

select trim(regexp_substr(T.手机品牌, '[^,]+', 1, levels.column_value)
from 表名 T,table(cast(multiset(select level from dual connect by level <= length(regexp_replace(t.ERROR_RULE, '[^,]+')) + 1) as sys.OdciNumberList)) levels             

SPARK

select explode(split(T.手机品牌,",")  from 表名 

MYSQL

select substring_index(substring_index(T.手机品牌,',', h.id + 1 ),',',-1)
from 表名 T
JOIN TABLE_HELP h ON h.id < (length(T.手机品牌) - length(REPLACE(T.手机品牌,',','')) + 1);

/*==============================================================*/
/* Table: TABLE_HELP                                */
/*==============================================================*/
CREATE TABLE TABLE_HELP (
   ID int(4) NOT NULL comment '个数',
   primary key (ID)
);
comment on table TABLE_HELP is
'列转行协助表';
-- ----------------------------
-- Records of TABLE_HELP 
-- ----------------------------
INSERT INTO TABLE_HELP VALUES (0);
INSERT INTO TABLE_HELP VALUES (1);
INSERT INTO TABLE_HELP VALUES (2);
INSERT INTO TABLE_HELP VALUES (3);
INSERT INTO TABLE_HELP VALUES (4);
INSERT INTO TABLE_HELP VALUES (5);
INSERT INTO TABLE_HELP VALUES (6);
INSERT INTO TABLE_HELP VALUES (7);
INSERT INTO TABLE_HELP VALUES (8);
.....

多行转列场景:

其实 就是跟上面的场景 反过来:

原始数据:

ID厂库名称厂库地址手机品牌类型
1手机厂库xxx路xxx街道小米
1手机厂库xxx路xxx街道华为
1手机厂库xxx路xxx街道苹果

目标数据:

ID厂库名称厂库地址手机品牌类型
1手机厂库xxx路xxx街道小米,华为,苹果

ORACLE

select WM_CONCAT(T.手机品牌类型) from 表名 T group by T.厂库名称         

SPARK

select concat_ws(',',collect_list(T.手机品牌类型)) from 表名 T group by T.厂库名称  

MYSQL

select GROUP_CONCAT(T.手机品牌类型,',') from 表名 T group by T.厂库名称  

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值