其实在之前就写过mysql关于分组小计再合计,只是当时限于知识和眼界所限,所以给了一个不能算是通用的方案的方案,仅仅只是从效果上完成了任务。随着时间的发展,见识到的东西也多了些,近期在使用Oracle,所以下面就以一个Oracle例子来展示下分组小计再合计的实现。

案例说明

【需求案例】:今有两张表存储商家交易情况详细,现欲了解各商家客户所购买商品情况。案例脚本及数据在文末。
表1描述的是交易单详情,结构如下

表2描述的是交易详情,结构如下
[外链图片转存中…(img-DcXJBgLY-1648357069738)]
废话不多说,直接上效果图
[外链图片转存中…(img-5ObUJp5n-1648357069738)]

代码分析

SELECT c.merchantcode 商家编号,c.CONSUMERCODE 消费者编号,c.GOODSCODE 商品编码,sum(c.goodstotal) 商品原价,sum(c.paytotal) 商品实价,(grouping(c.merchantcode) + grouping(c.CONSUMERCODE) + grouping(c.GOODSCODE)) FLAG,decode((grouping(c.merchantcode) + grouping(c.CONSUMERCODE) + grouping(c.GOODSCODE)),0,'明细',1,'小计',2,'合计','总计') 汇总标记FROM (SELECT * FROM alex_sn_info b right join alex_consum a on a.sn = b.sn) cgroup by rollup(c.merchantcode, c.CONSUMERCODE, c.GOODSCODE);

这里主要涉及**grouping()rollup()**两个函数。GROUPING函数可以接受一列,返回0或者1。如果列值为空,那么GROUPING()返回1;如果列值非空,那么返回0。GROUPING只能在使用ROLLUP或CUBE的查询中使用。当需要在返回空值的地方显示某个值时,GROUPING()就非常有用。ROLLUP分组函数可以理解为Group By分组函数封装后的精简用法,它的本质是在分组计算后再union all一个统计所有数据的行。例如:
select group_id,sum(salary) from group_test group by rollup(group_id);
它就等价于:
select group_id,sum(salary) from group_test group by group_id union all select null, sum(salary) from group_test order by 1;

[参考资料] http://blog.itpub.net/519536/viewspace-610995/
案例脚本

drop table alex_sn_info;
-- 交易单详情表:alex_sn_info
CREATE TABLE alex_sn_info
(id varchar2(20) NOT NULL,sn varchar2(20) NOT NULL,goodsCode varchar2(8) NOT NULL,goodsPrice number(12,2) DEFAULT 0.00 NOT NULL ,goodsCount number(11) DEFAULT 0 NOT NULL ,goodsTotal number(12,2) DEFAULT 0.00 NOT NULL ,discountRate number(3,2) DEFAULT 1 NULL ,payTotal number(12,2) DEFAULT 0.00 NOT NULL,goodsComment varchar2(100) DEFAULT NULL
);comment on column alex_sn_info.idis '交易明细流水号 ';
comment on column alex_sn_info.snis '交易单流水号';
comment on column alex_sn_info.goodsCodeis '商品编码 ';
comment on column alex_sn_info.goodsPriceis '商品单价';
comment on column alex_sn_info.goodsCountis '商品数量 ';
comment on column alex_sn_info.goodsTotalis '原价';
comment on column alex_sn_info.discountRateis '折扣率 ';
comment on column alex_sn_info.payTotalis '实价';
comment on column alex_sn_info.goodsCommentis '商品备注';     INSERT INTO alex_sn_info VALUES ('1', '00000000000000000001', 'SH000001', '20.00', '1', '20.00', '1.00', '20.00', '说明1');
INSERT INTO alex_sn_info VALUES ('2', '00000000000000000001', 'SH000002', '15.00', '2', '30.00', '1.00', '30.00', '');
INSERT INTO alex_sn_info VALUES ('3', '00000000000000000002', 'SH000003', '13.00', '1', '13.00', '0.90', '11.70', '说明1');
INSERT INTO alex_sn_info VALUES ('4', '00000000000000000002', 'SH000001', '20.00', '1', '20.00', '0.90', '18.00', '');
INSERT INTO alex_sn_info VALUES ('5', '00000000000000000002', 'SH000004', '7.00', '2', '14.00', '0.90', '12.60', '');
INSERT INTO alex_sn_info VALUES ('6', '00000000000000000003', 'SH000002', '15.00', '2', '30.00', '0.85', '25.50', '说明1');
INSERT INTO alex_sn_info VALUES ('7', '00000000000000000003', 'SH000005', '8.00', '1', '8.00', '0.85', '6.80', '');
INSERT INTO alex_sn_info VALUES ('8', '00000000000000000004', 'SH000005', '8.00', '2', '16.00', '1.00', '16.00', '说明2');
INSERT INTO alex_sn_info VALUES ('9', '00000000000000000005', 'SH000006', '11.50', '1', '11.50', '0.95', '10.93', '');
INSERT INTO alex_sn_info VALUES ('10', '00000000000000000005', 'SH000003', '13.00', '1', '13.00', '0.95', '12.35', '');
INSERT INTO alex_sn_info VALUES ('11', '00000000000000000006', 'SH000002', '15.00', '1', '15.00', '0.90', '13.50', '说明1');
INSERT INTO alex_sn_info VALUES ('12', '00000000000000000007', 'SH000001', '20.00', '1', '20.00', '1.00', '20.00', '');
INSERT INTO alex_sn_info VALUES ('13', '00000000000000000008', 'SH000005', '8.00', '2', '16.00', '0.85', '13.60', '');
INSERT INTO alex_sn_info VALUES ('14', '00000000000000000008', 'SH000006', '11.50', '3', '34.50', '0.85', '29.33', '');
INSERT INTO alex_sn_info VALUES ('15', '00000000000000000009', 'SH000002', '15.00', '2', '30.00', '0.70', '21.00', '');
INSERT INTO alex_sn_info VALUES ('16', '00000000000000000009', 'SH000008', '25.00', '1', '25.00', '0.70', '17.50', '');
INSERT INTO alex_sn_info VALUES ('17', '00000000000000000009', 'SH000003', '13.00', '1', '13.00', '0.70', '9.10', '说明1');
INSERT INTO alex_sn_info VALUES ('18', '00000000000000000009', 'SH000001', '20.00', '2', '40.00', '0.70', '28.00', '');
INSERT INTO alex_sn_info VALUES ('19', '00000000000000000010', 'SH000006', '11.50', '1', '11.50', '1.00', '11.50', '');
INSERT INTO alex_sn_info VALUES ('20', '00000000000000000010', 'SH000002', '15.00', '1', '15.00', '1.00', '15.00', '说明2');
INSERT INTO alex_sn_info VALUES ('21', '00000000000000000011', 'SH000002', '11.50', '3', '34.50', '0.85', '29.33', '说明2');
INSERT INTO alex_sn_info VALUES ('22', '00000000000000000012', 'SH000001', '15.00', '1', '15.00', '1.00', '15.00', '说明2');
INSERT INTO alex_sn_info VALUES ('23', '00000000000000000013', 'SH000006', '13.00', '1', '13.00', '0.95', '12.35', '说明2');drop table alex_consum;
-- 交易信息表:alex_consum
CREATE TABLE alex_consum (sn varchar2(20) NOT NULL, consumerCode varchar2(8) NOT NULL,consumDate varchar2(10) NOT NULL,consumTime varchar2(8) NOT NULL,consumTotal number(10,2) DEFAULT 0.00 NOT NULL,payType varchar2(2) NOT NULL,merchantCode varchar2(8) NOT NULL,consumComment varchar2(100)
);
comment on column alex_consum.sn is '交易单流水号';
COMMENT ON column alex_consum.consumerCode is '消费者编码';
COMMENT ON column alex_consum.consumDate is '交易日期';
COMMENT ON column alex_consum.consumTime is '交易时间';
COMMENT ON column alex_consum.consumTotal is '交易额度';
COMMENT ON column alex_consum.payType is '支付类型:0-支付宝,1-微信支付,2-现金交易';
COMMENT ON column alex_consum.merchantCode is '商家编码';
COMMENT ON column alex_consum.consumComment is '交易备注';INSERT INTO alex_consum VALUES('00000000000000000001','11260801','2017-06-12','09:13:23','50.00','0','11002038','一起酷夏活动');
INSERT INTO alex_consum VALUES ('00000000000000000002', '11260800', '2017-06-12', '09:23:45', '42.30', '0', '11002038', '');
INSERT INTO alex_consum VALUES ('00000000000000000003', '11260805', '2017-06-13', '10:17:24', '32.30', '1', '11002038', '');
INSERT INTO alex_consum VALUES ('00000000000000000004', '11260803', '2017-06-15', '09:33:26', '16.00', '0', '11002012', '端午促销');
INSERT INTO alex_consum VALUES ('00000000000000000005', '11260802', '2017-06-15', '09:34:25', '23.28', '1', '11002038', '端午促销');
INSERT INTO alex_consum VALUES ('00000000000000000006', '11260800', '2017-06-15', '09:40:47', '13.50', '0', '11002038', '端午促销');
INSERT INTO alex_consum VALUES ('00000000000000000007', '11260805', '2017-07-17', '09:11:23', '20.00', '2', '11002023', '');
INSERT INTO alex_consum VALUES ('00000000000000000008', '11260873', '2017-07-18', '09:23:22', '33.60', '0', '11002038', '');
INSERT INTO alex_consum VALUES ('00000000000000000009', '11260807', '2017-08-01', '09:10:17', '75.60', '0', '11002038', '');
INSERT INTO alex_consum VALUES ('00000000000000000010', '11260812', '2017-09-03', '09:13:55', '26.50', '1', '11002023', '');
INSERT INTO alex_consum VALUES ('00000000000000000011', '11260800', '2017-09-15', '09:40:47', '13.50', '0', '11002012', '端午促销');
INSERT INTO alex_consum VALUES ('00000000000000000012', '11260805', '2017-10-17', '09:11:23', '20.00', '2', '11002023', '');
INSERT INTO alex_consum VALUES ('00000000000000000013', '11260873', '2017-11-18', '09:23:22', '33.60', '0', '11002012', '');commit;-- 统计商家各消费者购买商品的具体情况
-- <商家编号,消费者会员编号,商品编号>
SELECT c.merchantcode 商家编号,c.CONSUMERCODE 消费者编号,c.GOODSCODE 商品编码,sum(c.goodstotal) 商品原价,sum(c.paytotal) 商品实价,decode((grouping(c.merchantcode) + grouping(c.CONSUMERCODE) + grouping(c.GOODSCODE)),0,'明细',1,'小计',2,'合计','总计') 汇总标记FROM (SELECT * FROM alex_sn_info b right join alex_consum a on a.sn = b.sn) cgroup by rollup(c.merchantcode, c.CONSUMERCODE, c.GOODSCODE);

Oracle关于分组小计再合计相关推荐

  1. Oracle 聚合实现小计、合计 (GROUP BY ROLLUP)

    1.先创建一个测试表 -- Create table 水果月销售记录表 create table C_FRUITS_SALES_RECORD_T (quarter VARCHAR2(20),--季度m ...

  2. Ureport2小计和合计功能

    原报表样式如下: 我们希望根据做小计和合计功能,希望实现的报表结果如下: 第一步: 先按要求设计如下报表: 此处主要说明三个sum(C1)的配置,基础配置不在复述,如果基础配置有问题,请查阅资料 ht ...

  3. oracle小鸡与合计,Excel EXCEL表中怎样快速实现小计和合计!excel小鸡 合计 总计

    怎么用EXCEL做每页自动小计? 步骤1 :前面插一列,在2至6入1,7至11行输入2.然后先取A2:A11,双击右下角向下填充,填充方式为复制单元格. 步骤2:选取整个数据表,数据 - 分类汇总 , ...

  4. Oracle 实现小计、合计

    方法一:group by rollup实现小计.合计 select decode(grouping(to_char(rownum)),1,'合计',to_char(rownum)),a.clienta ...

  5. oralce rollup 小计合计_用SQL实现统计报表中的“小计”和“合计”

    在开发统计报表的过程中,经常会碰到在查询到的数据集中,插入一些小计行和合计行.比如在烤烟系统中,几乎每个统计报表都需要加入"合计"行,还有不少涉及到烟叶等级的统计报表需要加入各烟叶 ...

  6. 用SQL实现统计报表中的“小计”和“合计”

    客户提出需求,针对某一列分组加上小计,合计汇总.网上找了一些有关SQL加合计的语句.都不是很理想.决定自己动手写. 思路有三个: 1.很多用GROUPPING和ROLLUP来实现.   优点实现代码简 ...

  7. mysql小计_Mysql必读用SQL实现统计报表中的小计与合计的方法详解

    <Mysql必读用SQL实现统计报表中的"小计"与"合计"的方法详解>要点: 本文介绍了Mysql必读用SQL实现统计报表中的"小计&qu ...

  8. mysql 合计 小计_用SQL实现统计报表中的小计与合计的方法详解

    本篇文章是对使用SQL实现统计报表中的"小计"与"合计"的方法进行了详细的分析介绍,需要的朋友参考下 客户提出需求,针对某一列分组加上小计,合计汇总.网上找了一 ...

  9. mysql中group小计与合计_用SQL实现统计报表中的“小计”和“合计”

    问题: 开发一个关于各烟叶等级的二次验级的原发件数.原发重量及验收重量的统计报表.其中,原发件数.原发重量和验收重量等列要求计算出各等级组别的小计和所有记录的合计. 语句: SELECT DECODE ...

最新文章

  1. HPE 的 OpenSwitch 项目得到 Linux 基金会支持
  2. 全面剖析Redis Cluster原理和应用 (good)
  3. 吴恩达深度学习课程deeplearning.ai课程作业:Class 2 Week 1 2.Regularization
  4. Confluence 6 针对你的数据库类型确定校验 SQL
  5. [CTO札记]谁在使用SNS
  6. 即时通讯源码_一对一视频直播系统源码是如何实现即时通讯呢?
  7. C++primer plus第六版课后编程题答案 6.6
  8. !!2016/02/22——当日买入——事后追悔,总结经验,忘记了买票的初衷!
  9. 关于BPSK、QPSK的一些理解,以及MATLAB实现
  10. maven项目中:java.io.IOException: java.io.FileNotFoundException--- (文件名、目录名或卷标语法不正确。)
  11. 记录学习历程-----游戏编程
  12. 软件需求分析期末试题
  13. python打开是什么颜色-Python中常见颜色记录
  14. HDU - 6438 Buy and Resell(思维+ 贪心)
  15. 【mcuclub】模数转换ADC0832
  16. 来公司必须了解的编码开发规范
  17. Visual Studio 2019版本运行报错解决方案
  18. JSP:论坛短消息功能模块扩展(Ajax)…
  19. ES6之符号与符号属性
  20. 定性分析如何解决疑难问题

热门文章

  1. C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(二十四) Be careful!前方怪物出没
  2. 代码实证:风险平价及其改进思路——主成分风险平价
  3. JRebel激活与配置
  4. 海森堡模型自洽平均场解
  5. 两两相望计算机音乐,两两相望 苏汐洋 两两相望歌曲,两两相望mp3在线试听 - 5nd音乐网...
  6. Linux上接收广播
  7. Android插件化方式实现View动态更新
  8. 我所知道查找算法之斐波拉契(黄金分割法)查找
  9. cv2不能识别gif
  10. 如何选型APS系统,还需明确这七大关键因素