【SQL系列】计算简单的小计

简介: 计算简单的小计

问题

在本实例中,你想创建一个结果集,其中包含小计(聚合分组的特定列)和总计(聚合整张表的特定列)。一个这样的结果集既包含 EMP 表中每种职位的薪水总额,也包含 EMP 表中所有薪水的总额,其中每种职位的薪水总额为小计,所有薪水的总额为总计。这种结果集如下所示。

JOB              SAL

--------- ----------

ANALYST         6000

CLERK           4150

MANAGER         8275

PRESIDENT       5000

SALESMAN        5600

TOTAL          29025

解决方案

GROUP BY 子句的 ROLLUP 扩展完美地解决了这个问题。如果你使用的 RDBMS 不支持 ROLLUP,则可以使用标量子查询或 UNION 查询来解决这个问题,只是难度更大。

DB2 和 Oracle

使用聚合函数 SUM 计算薪水总额,并使用 GROUP BY 的 ROLLUP 扩展将结果组织为小计(针对不同职位)和总计(针对整张表)。

select case grouping(job)

          when 0 then job

          else 'TOTAL'

          end  job,

      sum(sal) sal

from emp

group by rollup (job)

详细过程

首先,使用聚合函数 SUM 并按 JOB 分组,以计算不同职位的薪水总额。

select job, sum(sal) sal

 from emp

group by job


JOB         SAL

--------- -----

ANALYST    6000

CLERK      4150

MANAGER    8275

PRESIDENT  5000

SALESMAN   5600

然后,使用 GROUP BY 的 ROLLUP 扩展,以便在生成不同职位小计的同时生成总计。

select job, sum(sal) sal

 from emp

group by rollup(job)


JOB           SAL

--------- -------

ANALYST      6000

CLERK        4150

MANAGER      8275

PRESIDENT    5000

SALESMAN     5600

           29025

最后,使用函数 GROUPING 在总计行的 JOB 列显示标签。如果 JOB 值为 NULL,那么函数 GROUPING 将返回 1,这表明 SAL 值为 ROLLUP 生成的总计。如果 JOB 值不为 NULL,则函数 GROUPING 将返回 0,这表明 SAL 值是 GROUP BY(而不是 ROLLUP)生成的。通过在 CASE 表达式中调用 GROUPING(JOB),可以根据情况返回职位名称或标签 TOTAL。

select case grouping(job)

           when 0 then job

           else 'TOTAL'

      end job,

      sum(sal) sal

 from emp

group by rollup(job)

 

 

JOB              SAL

--------- ----------

ANALYST         6000

CLERK           4150

MANAGER         8275

PRESIDENT       5000

SALESMAN        5600

TOTAL          29025

SQL Server 和 MySQL

首先,使用聚合函数 SUM 计算薪水总额,并使用 WITH ROLLUP 将结果组织为小计(针对不同职位)和总计(针对整张表)。然后,使用 COALESCE 给总计行提供标签 TOTAL。(如果不这样做,该行的 JOB 列将为 NULL。)

select coalesce(job,'TOTAL') job,

      sum(sal) sal

 from emp

group by job with rollup

在 SQL Server 中,也可以像 Oracle/DB2 解决方案那样使用函数 GROUPING(而不是函数 COALESCE)来确定聚合等级。

PostgreSQL

与 SQL Server 和 MySQL 解决方案类似,也可以使用 GROUP BY 的 ROLLUP 扩展,但语法稍有不同。

select coalesce(job,'TOTAL') job,

       sum(sal) sal

 from emp

group by rollup(job)

补充

GROUPING函数

可以接受一列,返回0或者1。如果列值为空,那么GROUPING()返回1;如果列值非空,那么返回0。GROUPING只能在使用ROLLUP或CUBE的查询中使用。

当需要在返回空值的地方显示某个值时,GROUPING()就非常有用。

ROLLUP函数

ROLLUP是GROUP BY子句的扩展。 ROLLUP选项允许包含表示小计的额外行,通常称为超级聚合行,以及总计行。 通过使用ROLLUP选项,可以使用单个查询生成多个分组集。
使用语法:group by rollup(a,b)
说明:针对 a 列、b 列分别进行分组,再针对 (a,b) 组合列进行分组,最后汇总。

rollup通常和group by语句一起使用,是根据维度在分组的结果集中进行聚合操作


点个赞吧,这对我十分重要!

目录
相关文章
|
12月前
|
SQL 分布式计算 大数据
黑马程序员-大数据入门到实战-分布式SQL计算 Hive 入门
黑马程序员-大数据入门到实战-分布式SQL计算 Hive 入门
140 0
|
12月前
|
SQL 存储 大数据
黑马程序员-大数据入门到实战-分布式SQL计算 Hive 语法与概念
黑马程序员-大数据入门到实战-分布式SQL计算 Hive 语法与概念
128 0
|
14天前
|
SQL 存储 并行计算
Lindorm Ganos 一条 SQL 计算轨迹
Lindorm Ganos 针对轨迹距离计算场景提供了内置函数 ST_Length_Rows,结合原生时空二级索引和时空聚合计算下推技术,能够高效过滤数据并并行执行运算任务。该方案通过主键索引和时空索引快速过滤数据,并利用多Region并行计算轨迹点距离,适用于车联网等场景。具体步骤包括根据车辆识别代码和时间戳过滤数据、范围过滤轨迹点以及并行计算距离。使用限制包括只支持点类型列聚合运算及表中轨迹点需按顺序排列等。测试结果显示,Lindorm Ganos 在不同数据量下均能实现秒级响应。
13 3
|
2月前
|
SQL 数据挖掘 数据库
SQL计算班级语文平均分:详细步骤与技巧
在数据库管理中,经常需要统计和查询各种汇总信息,如班级某科目的平均分
|
5月前
|
SQL 存储 分布式计算
奇思妙想的SQL|去重Cube计算优化新思路
本文主要分享了作者在蚂蚁集团高管数据链路改造升级过程中,针对去重Cube的优化实践。
788 48
|
4月前
|
SQL 分布式计算 大数据
MaxCompute产品使用问题之odps sql 底层计算框架是MR吗
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
|
5月前
|
SQL 存储 算法
数据库编程大赛:一条SQL计算扑克牌24点
参加NineData举办的数据库编程大赛,展示你的技术才华!用一条SQL语句解决扑克牌24点的计算表达式。这场比赛面向数据库爱好者、开发者、程序员、DBA等,展示你的编程技能,并有机会赢得丰厚奖励。欢迎大家来挑战!
242 0
数据库编程大赛:一条SQL计算扑克牌24点
|
5月前
|
SQL
leetcode-SQL-1440. 计算布尔表达式的值
leetcode-SQL-1440. 计算布尔表达式的值
56 1
|
5月前
|
SQL
leetcode-SQL-1873. 计算特殊奖金
leetcode-SQL-1873. 计算特殊奖金
30 0
|
5月前
|
SQL 数据挖掘 数据处理
「SQL面试题库」 No_113 计算税后工资
「SQL面试题库」 No_113 计算税后工资