【ORACLE】数据拼接那些事-多行或多列按指定分隔符拼接

这篇具有很好参考价值的文章主要介绍了【ORACLE】数据拼接那些事-多行或多列按指定分隔符拼接。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

最近在做的某个项目中有一些数据预处理的工作,用的是Oracle数据库,涉及到表的拼接操作,在此记录一下并对数据库表的拼接知识做个扩充。

具体需求是:

  • 把年龄(AGE)、性别(GENDER)、客户等级(CUSLEVEL)三个字段用逗号隔开拼接成一个字段
  • 为空的字段不展示,三个字段全为空则置空

图中绿色框里的是需要拼接的原始字段;红色框里的是拼接后的效果。


【ORACLE】数据拼接那些事-多行或多列按指定分隔符拼接


这个需求是表多列之间的横向拼接,由于Oracle数据库没有像Postgre里array这种数组函数,因此只能使用 concat 函数或符号 || 来拼接。


多列横向拼接

--为实现这个需求,先造出上图演示数据
create table test1(
  CUS_NO varchar2(10),
  AGE int,
  GENDER varchar2(10),
  CUSLEVEL varchar2(10)
);
insert into test1(CUS_NO,AGE,GENDER,CUSLEVEL) values('cus_596492',41,'男','黄金级');commit;
insert into test1(CUS_NO,AGE,GENDER,CUSLEVEL) values('cus_265608',null,'女','钻石级');commit;
insert into test1(CUS_NO,AGE,GENDER,CUSLEVEL) values('cus_983740',28,null,'铂金级');commit;
insert into test1(CUS_NO,AGE,GENDER,CUSLEVEL) values('cus_356291',30,'男',null);commit;
insert into test1(CUS_NO,AGE,GENDER,CUSLEVEL) values('cus_356291',null,null,null);commit;
--横向拼接字段
select CUS_NO,AGE,GENDER,CUSLEVEL,
		   --拼接字段末尾逗号情况的处理
       decode(substr(pinjie,length(pinjie),1),',',substr(pinjie,1,length(pinjie)-1),pinjie) as pinjie
from (--使用拼接符 || 将三个字段拼接到一起
    select CUS_NO,AGE,GENDER,CUSLEVEL,
           decode(AGE, null, null, '年龄:'||AGE||',') ||
            decode(GENDER, null, null, '性别:'||GENDER||',') ||
            decode(CUSLEVEL, null, null, '客户等级:'||CUSLEVEL) as pinjie
    from test1
) a
;

多行纵向拼接

字段间的横向拼接处理起来比较容易,有时还会遇到多行数据的纵向拼接,比如下图是客户信用卡交易数据。如果我们想统计每个客户都在哪些月份发生了交易,即每个客户一条,月份间以逗号隔开,得到下表这样。

CUS_NO TRAN_MONTH
cus_101028 201910,201912,202003

【ORACLE】数据拼接那些事-多行或多列按指定分隔符拼接


为在Oracle中实现这种纵向按分隔符的分组拼接,可以使用Oracle的 LISTAGG 函数。

LISTAGG函数语法:
LISTAGG (measure_expr:any [, delimiter_expr:VARCHAR]) WITHIN GROUP(ORDER BY column_expr)

LISTAGG函数一般配合GROUP BY作为聚合函数(也可用于开窗函数)使用,可以传入两个参数变量

  • measure_expr:要合并处理的字段

  • delimiter_expr:给定分隔符号

  • column_expr:排序字段

--为实现这个需求,先造出上图演示数据
create table test2(
  CUS_NO varchar2(10),
  YEAR_MONTH varchar2(6),
  TRAN_AMT numeric(20,2)
);
insert into test2(CUS_NO,YEAR_MONTH,TRAN_AMT) values('cus_101028','201910',880.00);commit;
insert into test2(CUS_NO,YEAR_MONTH,TRAN_AMT) values('cus_101028','201912',2542.00);commit;
insert into test2(CUS_NO,YEAR_MONTH,TRAN_AMT) values('cus_101028','202003',535.66);commit;
insert into test2(CUS_NO,YEAR_MONTH,TRAN_AMT) values('cus_101133','202005',3150.00);commit;
insert into test2(CUS_NO,YEAR_MONTH,TRAN_AMT) values('cus_101133','202008',19200.00);commit;
insert into test2(CUS_NO,YEAR_MONTH,TRAN_AMT) values('cus_162656','202006',8100.00);commit;

--纵向拼接字段--聚合函数用法
select CUS_NO
      ,LISTAGG(YEAR_MONTH,',') WITHIN GROUP(ORDER BY YEAR_MONTH) AS PINJIE
from test2
group by CUS_NO;

拼接效果如下,这里可以思考下,如果一个客户某个交易月份有重复值,该如何得到没有重复月份值的拼接结果?


【ORACLE】数据拼接那些事-多行或多列按指定分隔符拼接


--纵向拼接字段--开窗函数用法
--聚合和开窗的区别在于:聚合函数每组只会返回一条数据(按group by的字段),但开窗函数会返回原数据所有行,但会额外增加统计字段
select CUS_NO,YEAR_MONTH
	     --按客户编号开窗
      ,LISTAGG(YEAR_MONTH,',') WITHIN GROUP(ORDER BY YEAR_MONTH) OVER(PARTITION BY CUS_NO) AS PINJIE
from test2;

拼接效果如下,开窗得到的结果可以和聚合结果以及原始数据作比较


【ORACLE】数据拼接那些事-多行或多列按指定分隔符拼接文章来源地址https://www.toymoban.com/news/detail-415650.html

到了这里,关于【ORACLE】数据拼接那些事-多行或多列按指定分隔符拼接的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 按分隔符分割字符串(DB2/mysql/hive/Oracle)

    1、DB2 --substr+locate/instr DB2没有自己按分隔符分割字符串的函数,只能结合使用 或者在DB2里还可以自己写一个split分割字符串的函数 附:instr函数用法--用来查找指定字符在字符串中出现的位置 DB2中的locate 函数可实现同样的功能,用法同 instr ,只是源字符串和目标字符串的位

    2024年02月13日
    浏览(44)
  • matlab如何读取矩阵的某行某列,多行多列,指定行指定列

    设有矩阵 a =      1     2     3      4     5     6      7     8     9 1:读取所有行所有列--直接键入 a或a(:,:) 2:  读取前 i 行,前 j 列。键入a( 1:i,  1:j)    其中 括号内,行列以逗号隔开,逗号前的控制行,逗号后的控制列 比如说读取矩阵a的前两行两列,键入a(1:2,1:2),于

    2023年04月08日
    浏览(35)
  • mysql数据库使用sql对特殊分隔符分隔的字段进行统计

    需求 在一个数据库表中有一个字段中的数据是通过特殊符号进行分隔的,现需要统计分隔符分开的各数据的条数。 数据准备  现需统计各个绝技的人数☺ 思路 使用sql根据逗号将一行数据拆分成多行数据 ,然后使用group by对拆分的数据进行统计。 三种方式,相同的原理 使用

    2023年04月17日
    浏览(91)
  • 在 Excel 中将列数据用单引号括起来并添加分隔符的解决方案

            在 Excel 中,有时候我们需要将某一列的所有值连接在一起,并且每个值用单引号括起来,同时在每个值之间添加逗号和空格。这样的需求在数据处理和导出时比较常见。本文将介绍一种使用 Excel 函数解决这个问题的方法。 解决方案: 方法一:使用 CONCATENATE 和

    2024年01月20日
    浏览(29)
  • 【Hive】分隔符 『 单字节分隔符 | 多字节分隔符』

    在创建表时,可以使用 row format ... 指定分隔符形式。比如: 但是,根据原始数据分隔符的复杂程度,需要指定不同的分隔形式。比如: 情况一:分隔符为单字节 分隔符为多字节 字段中包含了分隔符 方法:使用delimited 加上 delimited ,即使用 row format delimited :用

    2024年02月13日
    浏览(41)
  • 行转列--将多行数据转成多行多列的Table结构

    21年做的一个功能,涉及到将行数据转化成列数据。边查边做,一点一点的尝试着做好。当时感觉有点吃力。完成之后本想记录,但一直拖延至今。最近再次接手与这个功能相关的业务,整理了之前写的代码,趁此机会记录下来。 界面中是一个三级结构:L1级【Test Sample】,

    2024年02月05日
    浏览(44)
  • hive 分隔符

    在 Hive 中,分隔符用于指定数据文件中字段之间的分隔符。当你创建外部表或加载数据文件时,你可以指定分隔符,以便 Hive 正确地解析文件中的数据。 1. 创建外部表时指定分隔符: 当你创建外部表时,可以使用 ROW FORMAT 子句来指定数据文件中字段的分隔符。例如,如果你

    2024年02月09日
    浏览(35)
  • SQL实现一行数据分组后转多行多列

    在统计一些指标时,通常会有多个指标需要分组进行聚合,但是 数据源的粒度可能并非是指标分组的粒度 。举个例子,比如从访客表中提取访客的数据,每行数据有每个平台的首次访问时间;另外要做一个平台统计表,其中的一个指标统计的是各个平台近1天、7天、30天的新

    2024年02月14日
    浏览(30)
  • word的分隔符和分页符

    分隔符和分页符在Word中都是用于文本分段的工具,但它们的用途和操作方式有所不同。 分隔符是一个广义的概念,包括分页符、分节符和分栏符等。它是一种统称,可以将一个完整的文本内容分成两个或更多的部分。在将表格转换为文本时,分隔符用于标识文字分隔的位置

    2024年02月08日
    浏览(35)
  • 力扣2788-按分隔符拆分字符串

    题目链接 解题思路: 1 .传参是一个字符串数组,我们需要对每一个字符串处理 2 .解题中e是字符串数组中的每一个字符串 3 .i是每个字符串的下标,n为每个字符串的大小 4 .遍历整个字符串 5 .start是要切割的位置

    2024年01月20日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包