【Oracle】行转列的函数wm_concat,listagg,xmlagg,pivot以及动态行转列
【Oracle】行转列的几种情况
表的数据如下

朴实无华的函数
1.wm_concat
使用格式:
select 分组字段,wm_concat(要转换的列名) from 表名 group by 分组字段
实例:
select it.Code,wm_concat(it.inv) from ttt20230705 it group by it.Code

2.listagg() within group()
使用格式:
select 分组字段,listagg(要转换的列名,',') within group(order by 要转换的列名) from 表名 group by 分组字段
实例:
select it.Code,listagg(it.inv,',') within group(order by it.inv) from ttt20230705 IT group by it.Code

3.xmlagg
本质就是listagg加强版,详情见这里
4.pivot(本质还是case when)
使用格式:
select * from 表名 pivot(聚合函数(转换的字段名) for Code in (转换的值1 AS 字段名1,转换的值2 AS 字段名2,转换的值3 AS 字段名3));
实例:
select * from ttt20230705 pivot(listagg(inv,',') for Code in ('AA' AS AA,'BB' AS BB,'CC' AS CC));

动态行转列(行固定)
基本思路就是使用存储过程对SQL进行拼接,通过执行SQL对数据查询出来,然后将数据做成表或者视图,然后查询出来
参考这个
动态行转列(行不固定)
这种是什么意思呢,就是我现在遇到的问题
在这五个表中的数据各有关联,可以连表对某个类别的数据属性进行查询,但是问题就在于,同一个大类下的所有小类各有各的属性,可能上一个属性名是备注的位置,下一个类别的对应位置属性名就是走向,且大部分都是不一样的,也就形成了,一个类别对应多个子类别,每个子类别对应多个属性名,每个属性名对应每个属性数据,但是存储属性名和属性数据的表数据内容并不是一样的,这就导致,可能我行转列出来的数据是一团乱麻,没有价值
这种情况,最后的解决方法就只有最暴力的枚举了,对每个查询出来的属性名和数据单独再查询一次,才能保证每个数据都是对的,即
select
(select it.name from table2 it where it.a = t.a),
(select it.name from table2 it where it.a = t.b),
(select it.name from table2 it where it.a = t.c),
(select iit.data from table3 iit where iit.a = t.a),
(select iit.data from table3 iit where iit.a = t.b),
(select iit.data from table3 iit where iit.a = t.ab),
from table1 t
【Oracle】行转列的函数wm_concat,listagg,xmlagg,pivot以及动态行转列的更多相关文章
- java使用poi操作word, 支持动态的行(一个占位符插入多条)和表格中动态行, 支持图片
依赖 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifa ...
- 转:Oracle的列转行函数:LISTAGG()
先看示例代码: with temp as( select 'China' nation ,'Guangzhou' city from dual union all select 'China' nat ...
- 文本聚合函数(wm_concat, listagg, group_concat, string_agg)
实现目标 1.聚合文本 2.聚合文本(去重) 3.聚合文本(去重),按照指定字段排序 4.聚合文本(去重),按照指定字段排序,替换默认逗号分隔符 MySQL: group_concat ...
- Oracle行转列的函数
--行转列的函数-- CREATE OR REPLACE FUNCTION Calvin( col IN VARCHAR2,dw IN VARCHAR2) RETURN VARCHAR2 IS ret ...
- Oracle列转行函数LISTAGG()
--Oracle列转行函数LISTAGG() with tb_temp as( select 'China' 国家,'Wuhan' 城市 from dual union all select 'Chi ...
- Oracle列转行函数Listagg以及pivot查询示例
简单的Oracle列转行函数Listagg示例: CREATE TABLE tbl_test (catalog VARCHAR(1),product VARCHAR(2),amount NUMBER) ...
- oracle中行转列、列转行函数
多行转字符串 这个比较简单,用||或concat函数可以实现 select concat(id,username) str from app_user select id||username str ...
- Oracle列转行函数版本不兼容解决方案
业务场景 本博客记录一下Oracle列转行函数在Oracle11的一些不兼容问题,vm_concat在一些业务场景是必须的.不过这个函数使用要谨慎,底层实现应该也是group by等等实现的,性能并不 ...
- [转]Oracle 分组聚合二种写法,listagg和wmsys.wm_concat
本文转自:http://www.cnblogs.com/ycdx2001/p/3502495.html with temp as( select 'China' nation ,'Guangzhou' ...
- Oracle列转行函数使用
一.业务场景 今天需要实现一个table,有一列的效果是:用户姓名A(账号a),用户姓名B(账号b)...这种格式.这就想到oracle的列转行函数vm_concat. 可以用类似这种格式wm_con ...
随机推荐
- [Java]排序算法>交换排序>【冒泡排序】(O(N*N)/稳定/N较小/有序/顺序+链式)
1 冒泡排序 1.1 算法思想 交换排序的基本思想:两两比较待排序记录的关键字,一旦发现2个记录不满足次序要求时,则:进行交换,直到整个序列全部满足要求为止. 1.2 算法特征 属于[交换排序] 冒泡 ...
- BAT 基础语法
命令 //功能 echo //标准输出命令 在CMD窗口中 显示echo 后的内容 @ //关闭当前行的 回显 回显:源代码在 CMD 窗口中再次显示 pasue // 暂停程序 的执行 ...
- 记一次 Windows10 内存压缩模块 崩溃分析
一:背景 1. 讲故事 在给各位朋友免费分析 .NET程序 各种故障的同时,往往也会收到各种其他类型的dump,比如:Windows 崩溃,C++ 崩溃,Mono 崩溃,真的是啥都有,由于基础知识的相 ...
- Python-webdriver_manager的简单使用
前言: 提前祝大家五一快乐(*^▽^*) 我们在使用Selenium做UI自动化时都需要手动去下载各个浏览器版本的webdriver,有时我们可能还会遇到跨操作系统去进行测试. 以及有时因浏览器自动升 ...
- 【必知必会的MySQL知识】mysql5.7安装教程
1.下载mysql 下载地址:https://dev.mysql.com/downloads/mysql/5.7.html#downloads 下载zip免安装版,可以省去很多事 2.将下载的安装文件 ...
- 【笔记】跟吴恩达和IsaFulford学提示词工程(初级开发者入门课程)
标签: #Prompt #LLM 创建时间:2023-04-28 17:05:45 链接:课程(含JupyterNotebook) ,中文版 讲师:Andrew Ng,Isa Fulford 发表在: ...
- 【Redis】Setninel 哨兵机制
一.Sentinel 哨兵工作原理 Redis在2.6+以后引入哨兵机制,在2.8版本后趋于稳定状态,在生产环境中建议使用2.8版本以上的sentinel服务.sentinel集群用于监控redis集 ...
- CTFShow 反序列化 Web 255-266
CTFShow 反序列化 255-266 漏洞原理 未队用户输入的序列化字符串进行检测,导致攻击者可以控制反序列化过程,从而导致代码执行,SQL注入,目录遍历等后果. 触发条件 unserialize ...
- 2022-07-12:以下go语言代码输出什么?A:1 1;B:1.0 1.0;C:编译不通过;D:1.0 1。 package main import “fmt“ func main() {
2022-07-12:以下go语言代码输出什么?A:1 1:B:1.0 1.0:C:编译不通过:D:1.0 1. package main import "fmt" func ma ...
- 2021-03-10:一个数组上共有 N 个点,序号为0的点是起点位置,序号为N-1 的点是终点位置。现在需要依次的从 0 号点走到 N-1 号点。但是除了 0 号点和 N-1 号点,他可以在其余的 N-2 个位置中选出一个点,并直接将这个点忽略掉,问从起点到终点至少走多少距离?
2021-03-10:一个数组上共有 N 个点,序号为0的点是起点位置,序号为N-1 的点是终点位置.现在需要依次的从 0 号点走到 N-1 号点.但是除了 0 号点和 N-1 号点,他可以在其余的 ...