【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以及动态行转列的更多相关文章

  1. java使用poi操作word, 支持动态的行(一个占位符插入多条)和表格中动态行, 支持图片

    依赖 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifa ...

  2. 转:Oracle的列转行函数:LISTAGG()

    先看示例代码: with temp as( select 'China' nation ,'Guangzhou' city from dual union all select 'China' nat ...

  3. 文本聚合函数(wm_concat, listagg, group_concat, string_agg)

    实现目标   1.聚合文本   2.聚合文本(去重)   3.聚合文本(去重),按照指定字段排序   4.聚合文本(去重),按照指定字段排序,替换默认逗号分隔符 MySQL: group_concat ...

  4. Oracle行转列的函数

    --行转列的函数-- CREATE OR REPLACE FUNCTION Calvin( col IN VARCHAR2,dw IN VARCHAR2) RETURN VARCHAR2 IS ret ...

  5. Oracle列转行函数LISTAGG()

    --Oracle列转行函数LISTAGG() with tb_temp as( select 'China' 国家,'Wuhan' 城市 from dual union all select 'Chi ...

  6. Oracle列转行函数Listagg以及pivot查询示例

    简单的Oracle列转行函数Listagg示例: CREATE TABLE tbl_test (catalog VARCHAR(1),product VARCHAR(2),amount NUMBER) ...

  7. oracle中行转列、列转行函数

    多行转字符串 这个比较简单,用||或concat函数可以实现 select concat(id,username) str from app_user select id||username str ...

  8. Oracle列转行函数版本不兼容解决方案

    业务场景 本博客记录一下Oracle列转行函数在Oracle11的一些不兼容问题,vm_concat在一些业务场景是必须的.不过这个函数使用要谨慎,底层实现应该也是group by等等实现的,性能并不 ...

  9. [转]Oracle 分组聚合二种写法,listagg和wmsys.wm_concat

    本文转自:http://www.cnblogs.com/ycdx2001/p/3502495.html with temp as( select 'China' nation ,'Guangzhou' ...

  10. Oracle列转行函数使用

    一.业务场景 今天需要实现一个table,有一列的效果是:用户姓名A(账号a),用户姓名B(账号b)...这种格式.这就想到oracle的列转行函数vm_concat. 可以用类似这种格式wm_con ...

随机推荐

  1. [Git/GitLab]使用SSH远程登录GitLab/GitHub

    1 前言 近日,换了台新电脑. 今日,正要更新(git pull)GitLab的源码时,在配置(用户名,邮箱,密码git config --global -l)完全无误的情况下,却报出如下错误: $ ...

  2. LeeCode 319周赛复盘

    T1: 温度转换 思路:模拟 public double[] convertTemperature(double celsius) { return new double[]{celsius + 27 ...

  3. java.lang.OutOfMemoryError- unable to create new native thread 问题排查

    问题描述 最近连续两天大约凌晨3点,线上服务开始异常,出现OOM报错.且服务所在的物理机只能ping通,但是无法登录.报错信息如下: ERROR 04-12 03:01:43,930 [Default ...

  4. token验证

    token验证 什么是token?我相信很多开发者都或多或少听过基于 token 的用户鉴权和基于 session 的用户鉴权,而今天说的 token 验证就是第一种了.token 的意思是" ...

  5. Java中方法的定义和使用

    方法的定义和使用 注意事项: 1.方法与方法之间是 平级关系 不可以嵌套定义 2.方法的位置 可以在类{}中任意位置 3.方法定义之后 之后被调用 才能被执行 4.return 关键字的作用  返回关 ...

  6. c# 异步进阶———— 自定义 taskschedule[三]

    前言 我们知道我们的task async 和 await 是基于线程池进行调度的. 但是async 和 await 也就是使用了默认的task调度,让其在线程池中运行. 但是线程池是榨干机器性能为本质 ...

  7. TENGSHE-OS-渗透测试系统-win11版

    下载ISO文件 创建新的虚拟机 VM17 已支持直接创建 win11 x64 稍后安装系统 选中win11 修改路径 win11需要设置8位加密密码 勾选安全引导 根据自身情况选择 默认即可 150G ...

  8. 使用扩展函数方式,在Winform界面中快捷的绑定树形列表TreeList控件和TreeListLookUpEdit控件

    在一些字典绑定中,往往为了方便展示详细数据,需要把一些结构树展现在树列表TreeList控件中或者下拉列表的树形控件TreeListLookUpEdit控件中,为了快速的处理数据的绑定操作,比较每次使 ...

  9. 2022-05-12:小歪每次会给你两个字符串: 笔记s1和关键词s2,请你写一个函数, 判断s2的排列之一是否是s1的子串。 如果是,返回true; 否则,返回false。 来自字节飞书团队。

    2022-05-12:小歪每次会给你两个字符串: 笔记s1和关键词s2,请你写一个函数, 判断s2的排列之一是否是s1的子串. 如果是,返回true: 否则,返回false. 来自字节飞书团队. 答案 ...

  10. 2021-08-07:与数组中元素的最大异或值。给你一个由非负整数组成的数组 nums 。另有一个查询数组 queries ,其中 queries[i] = [xi, mi] 。第 i 个查询的答案是

    2021-08-07:与数组中元素的最大异或值.给你一个由非负整数组成的数组 nums .另有一个查询数组 queries ,其中 queries[i] = [xi, mi] .第 i 个查询的答案是 ...