Oracle group by 扩展函数详解(grouping sets、rollup、cube)

2023-05-16

文章目录

  • 1 概述
  • 2 分组函数
    • 2.1 group by:一起分组(1)
    • 2.2 grouping sets:单独分组(N)
    • 2.3 rollup:累计累加(N + 1)
    • 2.4 cube:交叉列表(2^N)
  • 3 扩展列
    • 3.1 grouping:列是否为空
    • 3.2 grouping_id:非空列合计
    • 3.3 group_id:标识重复组

1 概述

1. 一般求和函数:聚合函数 |+ group by(1) 聚合函数: count(1)sum()avg()max()min() 

2. 高级分组函数:相当于多次 group by + union all,但效率更高 -- 若有 N 列
   (1) grouping sets:单独分组,group by N 次
   (2) rollup		:累计累加,group by N + 1 次,有默认排序
   (3) cube			:交叉列表,group by 2^N 次,无默认排序,rollup 的扩展

3. 扩展列
   (1) grouping     : 判断列值是否为空(0:非空,1:空)
   (2) grouping_id  :非空列合计,grouping 的扩展(二进制,注意顺序)
   (3) group_id()   :标识重复组(0:第一次分组,1:重复分区,无入参)

2 分组函数

基础数据准备:

-- 人员信息表
create table person_info (
   person_no     number(5),
   person_name   varchar2(30),
   sex           varchar2(3),
   money         number(8),
   work_location varchar2(10)
);

-- 测试数据
insert into person_info (person_no, person_name, sex, money, work_location)
values (1, '瑶瑶', '女', 100000, '深圳');

insert into person_info (person_no, person_name, sex, money, work_location)
values (2, '倩倩', '女', 200000, '深圳');

insert into person_info (person_no, person_name, sex, money, work_location)
values (3, '优优', '男', 300000, '深圳');

insert into person_info (person_no, person_name, sex, money, work_location)
values (4, '丽丽', '女', 200000, '武汉');

insert into person_info (person_no, person_name, sex, money, work_location)
values (5, '萌萌', '女', 100000, '武汉');
commit;

2.1 group by:一起分组(1)

1. group by:最基础的分组函数

2. 注意:不能对 'clob' 列分组 

例1:查询各地区的人数

select pi.work_location 地区, 
       count(1) 人数
  from person_info pi
 group by pi.work_location;

查询结果:

地区		人数
深圳		3
武汉		2

例2:不能对 clob 列分组(知晓即可,实际开发中,咱也不会这么操作)

-- 不能对 'clob' 类型项目进行 'group by'
with t_person_info as
 (select to_clob(pi.work_location) work_location_clob 
    from person_info pi)
select t.work_location_clob 地区,
       count(1) 人数
  from t_person_info t 
 group by t.work_location_clob;

查询结果:
在这里插入图片描述

2.2 grouping sets:单独分组(N)

1. group by (a, b)
   (1) 对 a, b '一起' 进行分组

2. group by grouping sets(a, b)
   (1) 对 a, b '单独' 进行分组
   (2) 等同于:
	   group by a
	   union all
	   group by b

测试截图:
在这里插入图片描述

等效 sql :

select pi.work_location 地区,  
       '' 性别,
       count(1) 人数
  from person_info pi
 group by pi.work_location
 
 union all
select '' 地区,  
       pi.sex 性别,
       count(1) 人数
  from person_info pi
 group by pi.sex;

2.3 rollup:累计累加(N + 1)

1. group by rollup(a, b)
   (1) 首先对 'a, b' 一起 group by
   (2) 然后对 'a' group by
   (3) 最后计算 '聚合函数'

2. 若有 N 列,则 group by N + 1 次(1group by null, null, 聚合函数)

3. 有默认排序:order by a, b 

测试截图:
在这里插入图片描述

等效 sql:

select * from (
  select a, b, null, count(1) from table_name group by(a, b, null)
  union all
  select a, null, null, count(1) from table_name group by (a, null, null)
  union all
  select null, null, null, count(1) from table_name group by (null, null, null)
) order by a, b

2.4 cube:交叉列表(2^N)

1. group by cube(a, b)
   (1) 首先对 'a, b' 一起 group by
   (2) 然后对 'a' group by 
   (3) 然后对 'b' group by -- 比 rollup 多此一项
   (4) 最后计算 '聚合函数'

2. cube 是 rollup 的扩展,组合类型更多
   若有 N 列,则 group by 2^N 次
   
3. 没有默认排序,这点和 rollup 不同
   (1) cube  : 只要列名一样,顺序无所谓,结果是都一样的
   (2) rollup: 列的顺序不同,结果不同

测试截图:
在这里插入图片描述

3 扩展列

3.1 grouping:列是否为空

1. 作用:'判断列值是否为空'
   (1) grouping = 0 => '非空'
   (2) grouping = 1 => '空'

2. 常用 grouping set, cube, rollup 一起使用

测试截图:
在这里插入图片描述

3.2 grouping_id:非空列合计

1. grouping_id 是 grouping 的扩展
   (1) grouping   : 区分列是否为空
   (2) grouping_id: 区分 grouping 列 '合计'(注意顺序)

2. 返回的 '二进制数',显示的是 '十进制数'
   (1) 1 + 1 = 112进制) = 310进制)
   (2) 1 + 0 = 102进制) = 210进制)

测试截图:
在这里插入图片描述

3.3 group_id:标识重复组

1. group_id(): 标识重复组(执行多次)
   (1) 无参数
   (2) 若返回值为 0:第一次分组
       若返回值为 1:重复分组

测试截图:
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Oracle group by 扩展函数详解(grouping sets、rollup、cube) 的相关文章

  • oracle sql中where条件的动态数量

    我需要为报告工具中的提示编写一条sql 我得到变量中用 分隔的多个值的列表 并且这些值的数量可以变化 例如1 abc def eg2 abc def xyz 现在我需要在oracle中编写这种形式的sql 逻辑上 select someth
  • java.library.path 中没有 ocijdbc12

    我正在尝试使用 OCI 驱动程序通过 java 程序连接到 oracle 以下是配置 Windows 7 32 位 JDK 1 7 Oracle 客户端 11g R2 ojdbc7 jar在我的独立应用程序的类路径中 但我收到以下异常 Ex
  • SQL状态[99999];错误代码[17004];无效的列类型:1111 使用 Spring SimpleJdbcCall

    大家好 我正在使用 spring 简单的 JDBC 模板来调用 oracle 过程 下面是我的代码 步骤 create or replace PROCEDURE get all system users pi client code IN
  • 在 Oracle BI Publisher 中将数字转换为单词

    我有一个要求 我需要将发票总金额显示为 rtf 中的文字 我尝试过 but it doesn t show any thing Is there any RTF Tag to do such a requirement on layout
  • Oracle group by 中的字符串聚合

    我已经形成了一个大型查询 它使用以下数据条件获取大型数据集 Column1 Column2 M1 OTH M1 HHM M1 RES M2 HHM M2 RES M3 OTH M3 RES 我需要将其形成为 M1 OTH HHM RES M
  • R中不同级别的李克特分组

    我想使用 Likert 包 并按变量分组并绘制结果 问题是我想要可视化的变量有不同的级别 有没有解决的办法 一个简单的例子来说明我的问题 library reshape library likert foo lt data frame ca
  • 按对象值分组,统计后按最大对象属性设置组键

    我设法使用 Java 8 Streams API 编写了一个解决方案 该解决方案首先按对象 Route 的值对列表进行分组 然后计算每组中的对象数量 它返回一个映射 Route gt Long 这是代码 Map
  • Rails 建模:将 HABTM 转换为 has_many :through

    我正在现有的 Rails 站点上进行维护工作 并且遇到了一些由多对多关联引起的问题 看起来该网站最初是使用has and belongs to many对于一些业务逻辑变得更加复杂的关系 所以我需要使用has many through而是支
  • 如何对Oracle进行SQL注入

    我正在对一个系统进行审计 开发人员坚称该系统可以防止 SQL 注入 他们通过去掉登录表单中的单引号来实现这一点 但后面的代码没有参数化 它仍然使用字面 SQL 如下所示 username username Replace var sql s
  • 想要从字符格式转换为带小数的数字格式

    想要将字符格式 00001000000 转换为10000 00 请帮我 我已经尝试过 select to number 00012300 9999999999 99 nls numeric characters from dual 这个脚本
  • SQL:两个没有完整列匹配的表的并集

    我有一个table A其中有一组列A1 A2和一个具有一组列的 table bB1 B2 碰巧的是A2 B1但其余列不匹配 也不应该匹配 我想附加表格 所以我使用UNION ALL 对于不匹配的列 我使用null as COLUMN NAM
  • 如何使用to_sql将pandas数据帧写入oracle数据库?

    我是一个新的oracle学习者 我正在尝试将 pandas 数据帧写入 oracle 表中 经过网上研究 我发现代码本身很简单 但我不知道为什么我的代码不起作用 我已经从本地文件中读取了 pandas 数据框 import cx Oracl
  • 如何从 Oracle 中的 select 语句调用带有 Rowtype 参数的函数

    我有一个 oracle 函数 它有一个 in 参数 它是表的行类型 我需要从 select 语句将当前行传递给这个函数 以便它进行一些处理并返回一个值 是否有一个伪变量可以在 select 语句的上下文中使用 相当于触发器中的旧的和新的 我
  • 数据库的创建日期

    这是一个问题 起源于this https stackoverflow com questions 2522626 check how old an oracle database is 2523227 2523227杰米提出的问题 我想我会
  • 在Oracle中查找不包含数字数据的行

    我试图在一个非常大的 Oracle 表中找到一些有问题的记录 即使该列是 varchar2 列 也应包含所有数值数据 我需要找到不包含数字数据的记录 当我尝试在此列上调用 to number col name 函数时 它会抛出错误 我想你可
  • simpleJdbcCall 调用 Pl/SQL 过程 -- ORA-22922 不存在的 LOB 值

    我收到此 SQLException ORA 22922 不存在的 LOB 值 我的场景是 我正在调用一个采用结构数组的过程 该结构体包含三种类型 两种是日期 一种是 Clob 当我使用 Spring 的 simpleJdbcCall 设置
  • 组和平均 NumPy 矩阵

    假设我有一个任意的 numpy 矩阵 如下所示 arr 6 0 12 0 1 0 7 0 9 0 1 0 8 0 7 0 1 0 4 0 3 0 2 0 6 0 1 0 2 0 2 0 5 0 2 0 9 0 4 0 3 0 2 0 1 0
  • 在sql plus脚本中运行循环

    我正在 sql plus 中运行脚本 我的脚本中有一个 for 循环 BEGIN FOR count IN 1 100 LOOP INSERT INTO CompanyShare VALUES count 1 250 END LOOP EN
  • Oracle - 获取星期几

    今天是星期二 为什么当我运行这个 SQL 语句时 它说今天不是星期二 SELECT CASE WHEN TO CHAR sysdate Day Tuesday THEN Its Tuesday ELSE Its Not Tuesday EN
  • 如何将类型添加到 Vite 库构建中?

    我按照vite文档使用图书馆模式 https vitejs dev guide build html library mode我能够生成一个工作组件库 我创建了该项目vue ts预设 在我的组件中 我定义了道具及其类型 并使用了一些接口 但

随机推荐

  • amixer命令

    简述amixer及其用法 alsamixer是Linux 音频架构ALSA中的Alsa工具的其中一个 xff0c 用于配置音频的各个参数 alsamixer是基于文本下的图形界面的 xff0c 可以通过键盘的上下键 xff0c 左右键等 x
  • 安装ubuntu系统中磁盘分区

    硬件 xff1a vostro 1450 xff0c 本身有一块机械硬盘HDD xff08 500G xff09 加了一块固态硬盘SSD xff08 120G xff09 xff0c 组成HDD 43 SSD双硬盘 目的 xff1a SDD
  • Could not find encoder for codec id 27: Encoder not found

    在detectron2测试demo时出现如题所示问题 xff0c 解决 xff1a 改 xff1a fourcc 61 cv2 VideoWriter fourcc 34 x264 34 为 xff1a fourcc 61 cv2 Vide
  • Ubuntu查看磁盘使用情况

    xff08 1 xff09 查看文件大小 查看当前文件夹下所有文件大小 xff08 包括子文件夹 xff09 du sh du h 15M package 16K fontconfig 4 0K cache 5 1M rpmdb 20M 查
  • 最简单的方式解决ubuntu 16.04 屏幕亮度问题

    本教程不需要修改grub xff08 因为我的ubuntu 没有 sys class backlight intel backlight brightness 这个目录 xff09 xff0c 我也装过brightness indicato
  • 按列合并两个.txt 文件

    一颗行走的大白菜 转载请标明出处 网上给出了好多答案 xff0c 动辄几十行的python 脚本让人好烦 xff0c 然后我们的linux仅仅需要一条命令就能解决 xff1a 先给出截图 xff1a 我要合并read txt read1 t
  • python: np.pad() 函数的用法

    在卷积神经网络中 xff0c 为了避免因为卷积运算导致输出图像缩小和图像边缘信息丢失 xff0c 常常采用图像边缘填充技术 xff0c 即在图像四周边缘填充0 xff0c 使得卷积运算后图像大小不会缩小 xff0c 同时也不会丢失边缘和角落
  • matlab 如何使用mex

    MATLAB与C语言混合编程接口 MATLAB是一种解释性语言 xff0c 不需要编译 xff0c 调试比较方便 xff0c 但是缺点是速度慢 这一点在执行复杂的科学算法的时候体现极为明显 而C语言虽然相对比 较复杂 xff0c 但是执行效
  • 关于在终端能到import模块 而在jupyter notebook无法导入的问题

    这个问题让我查了许多天才解决 xff0c 为了避免后面的人重复走弯路 xff0c 记录下来 问题描述 xff1a 我在ubuntu 下编译安装了caffe xff0c 在命令行模式下可以import caffe xff0c 但是在jupyt
  • PCA原理

    版权声明 xff1a 本文为博主原创文章 xff0c 未经博主允许不得转载 https blog csdn net zhongkelee article details 44064401 转载请声明出处 xff1a http blog cs
  • 当表格太大超过一栏时

    表格大小的调整 当表格太大超过一栏时 xff0c 可以调节 首先文章导言区加入 usepackage graphicx 然后在要缩小的位置加入语句 resizebox 0 5 textwidth 要缩小的表格 要注意的是要把待缩小的表格放到
  • 安装了keras,报错 importerror: no module named kears

    原因可能如下 xff1a 你使用的python 默认是2 7 或者是3 6 xff0c 而keras 安装到了python3 5或python 3 6 的路径下 xff0c 此时 xff0c 你需要重新安装keras并指定安装路径 可以测试
  • module.exports、exports和export、export default的区别,import和require的区别

    在vue及其他模块化开发中 xff0c 经常会用到这些输出和引用的语句 xff0c 那么 xff0c 怎么在合适的时候用合适的语句呢 xff0c 怎么区分它们呢 xff1f 一 理论区别 首先 xff0c module exports和ex
  • Linux docker 安装

    先执行wget qO https get docker com sh 命令安装docker 执行该命令可能会出现wget命令找不到的问题 xff0c 那我们就先要执行yum install wget 命令安装wget 安装完后就可以使用wg
  • ITK和VTK比较

    概念比较安装步骤遇到的问题 概念比较 基本概念ITK xff08 Insight Segmentation and Registration Toolkit xff09 VTK xff08 visualization toolkit xff
  • 关于12864液晶屏汉字显示问题

    在我们学习或者开发12864显示屏 xff08 带字库 xff09 的过程中 xff0c 可能大家会遇到我这样的情况 如下 xff1a 第三行的 数学 两字显示不出来 xff1f 而第四行却可以 xff0c 为什么 xff1f 答案显而易见
  • IOS10-IOS13屏蔽系统更新描述文件|去除‘设置’①小红点教程

    大家都知道在iPhone系统更新的时候都会提示咱们进行更新 xff0c 但是有些小伙伴不想更新 xff0c 但是不更新有一个小红点1这样人很烦躁 xff0c 对于强迫症的人实在是忍不了 xff0c 今天我就给大家分享一个方法 xff0c 只
  • iOS13屏蔽系统自动更新,去除①红标,这个文件复活了!

    iPhone手机系统每一次发布新版本 xff0c 大家经常会接收到系统自动推送的升级提示 xff0c 经常会在大家不知情的情况下系统就在后台自动把系统升级包给自动下载下来了 xff0c 经常会弹出一个提示窗提醒升级 xff0c 这对于一些不
  • AC代码

    此处省略一万分AC代码 加油咯 xff01 xff01 xff01 代码还是尽量自己写 xff0c 看别人的博客不是不可以 xff0c 看别人的代码也不是不可以 xff0c 如果你不看比人的博客 xff0c 不看别人的代码 xff0c 不看
  • Oracle group by 扩展函数详解(grouping sets、rollup、cube)

    文章目录 1 概述2 分组函数2 1 group by xff1a 一起分组 xff08 1 xff09 2 2 grouping sets xff1a 单独分组 xff08 N xff09 2 3 rollup xff1a 累计累加 xf