任务:从资产表选出一类资产,并统计此类资产在不同地区的五种状态的占有量/

*************资产状态*****************
402001:在使用
401004:库存
403002:维修备用
405001:报废-待处理
405003:报废-已处置
*******************************/

1.从资产表统计五种状态下的此类资产在不同地区的数目

select ac.region_right_of_use_code,
ac.assets_state,
count(*) as sum_electrocar
from assets_cards ac
where ac.small_type_code = 'J1202'
and ac.assets_state in
('402001', '401004', '403002', '405001', '405003')
group by ac.region_right_of_use_code, ac.assets_state  order by ac.region_right_of_use_code;

结果如下:

2.使用rollup函数:

rollup函数:是group by的扩展,可以为每个分组返回小计记录以及为所有分组返回总计记录

cube 函数:也是group by的扩展,可以返回每一个列组合的小计记录,同时在末尾加上总计记录。

表达式:

rollup:Group by ROLLUP(A, B, C)的话,首先会对(A、B、C)进行GROUP BY,然后对(A、B)进行GROUP BY,然后是(A)进行GROUP BY,最后对全表进行GROUP BY操作。

cube:GROUP BY CUBE(A, B, C),则首先会对(A、B、C)进行GROUP BY,然后依次是(A、B),(A、C),(A),(B、C),(B),(C),最后对全表进行GROUP BY操作。

当我们使用rollup函数来统计资产每个状态的数目:

select t.region_right_of_use_code,
decode(grouping_id(t.region_right_of_use_code, t.assets_state),
1,
'总计',
'3',
'',
t.assets_state) as assets_state,
grouping_id(t.region_right_of_use_code, t.assets_state),
sum(t.sum_electrocar) as sum_electrocar
from (select ac.region_right_of_use_code,
ac.assets_state,
count(*) as sum_electrocar
from assets_cards ac
where ac.small_type_code = 'J1202'
and ac.assets_state in
('402001', '401004', '403002', '405001', '405003')
group by ac.region_right_of_use_code, ac.assets_state
order by ac.region_right_of_use_code) t
group by rollup(t.region_right_of_use_code, t.assets_state)

首先是以以区部region_right_of_use_code分组,再以资产状态assets_state分组统计,

其中grouping_id是参数都必须是GROUP BY 列表的元素,返回按GROUPING位向量进行计算的十进制值。下面我们通过一个例子来研究grouping_id函数是如何按照grouping函数的位向量进行计算的。

SQL> select grouping(a) ca,grouping(b) cb,grouping_id(a,b) caandb, a,b,sum(n) from testgroup group by rollup(a,b);

Result:

CA CB CAANDB A B SUM(N)
0 0 0 a1 b1 30
0 1 1 a1   30
1 1 3     30

位向量计算方法:如上例,

第一行,CA=0,CB=0,那么位向量就是“00”,换算成十进制是0

第二行,CA=0,CB=1,那么位向量就是‘01’,换算成十进制是1

第三行,CA=1,CB=1,那么位向量就是‘11’,换算成十进制是3

我们比较一下用grouping_id做的数据分组

select t.region_right_of_use_code,
decode(grouping_id(t.region_right_of_use_code, t.assets_state),
1,
'总计',
'3',
'',
t.assets_state) as assets_state,
grouping_id(t.region_right_of_use_code, t.assets_state),
sum(t.sum_electrocar) as sum_electrocar
from (select ac.region_right_of_use_code,
ac.assets_state,
count(*) as sum_electrocar
from assets_cards ac
where ac.small_type_code = 'J1202'
and ac.assets_state in
('402001', '401004', '403002', '405001', '405003')
group by ac.region_right_of_use_code, ac.assets_state
order by ac.region_right_of_use_code) t
group by rollup(t.region_right_of_use_code, t.assets_state)

结果如下:

第二红列是用grouping_id根据region_right_of_use_code, assets_state(区部,状态)分组计算的十进制值,0表示状态数据,1为对应区部下的此类资产所有状态的总计,3为对应所有区部的此类资产所有状态的总计,可以直接用decode转换对应的文字,比如1为总计,符合我们业务需求来统计每个区部相关状态的资产总计,0转换为对应的状态数据,3置空(为接下来去掉这类数据做准备);

让我们看看cube是怎么样的数据呈现:

select t.region_right_of_use_code,
decode(grouping_id(t.region_right_of_use_code, t.assets_state),
1,
'总计',
'3',
'',
t.assets_state) as assets_state,
grouping_id(t.region_right_of_use_code, t.assets_state),
sum(t.sum_electrocar) as sum_electrocar
from (select ac.region_right_of_use_code,
ac.assets_state,
count(*) as sum_electrocar
from assets_cards ac
where ac.small_type_code = 'J1202'
and ac.assets_state in
('402001', '401004', '403002', '405001', '405003')
group by ac.region_right_of_use_code, ac.assets_state
order by ac.region_right_of_use_code) t
group by cube(t.region_right_of_use_code, t.assets_state)

结果:

跟rollup不同之处就是cube先统计总后分组统计,比如3为统计所有区部的五种状态资产数目,2为各个状态的资产数目,1为统计地区下五种状态的资产数目,0为资产状态,

其实就是先统计所有的数据,然后根据状态统计资产总数目,最后根据区部统计资产总数目,再根据区部分状态统计资产数目。

为了我们最初的报表,我现在用rollup函数做处理:

select tt.region_right_of_use_code,
sum(nvl(decode(tt.assets_state, '402001', sum_electrocar), 0)) as S_E_C_402001,
sum(nvl(decode(tt.assets_state, '401004', sum_electrocar), 0) )as S_E_C_401004,
sum(nvl(decode(tt.assets_state, '403002', sum_electrocar), 0) )as S_E_C_403002,
sum(nvl(decode(tt.assets_state, '405001', sum_electrocar), 0)) as S_E_C_405001,
sum(nvl(decode(tt.assets_state, '405003', sum_electrocar), 0)) as S_E_C_405003,
sum(nvl(decode(tt.assets_state, '总计', sum_electrocar), 0)) as S_E_C
from (select t.region_right_of_use_code,
decode(grouping_id(t.region_right_of_use_code, t.assets_state),1,'总计','3','',t.assets_state) as assets_state,
grouping_id(t.region_right_of_use_code, t.assets_state),
sum(t.sum_electrocar) as sum_electrocar
from (select ac.region_right_of_use_code,
ac.assets_state,
count(*) as sum_electrocar
from assets_cards ac
where ac.small_type_code = 'J1202'
and ac.assets_state in
('402001', '401004', '403002', '405001', '405003')
group by ac.region_right_of_use_code, ac.assets_state order by ac.region_right_of_use_code) t
group by rollup(t.region_right_of_use_code, t.assets_state)) tt
where tt.assets_state is not null group by tt.region_right_of_use_code order by tt.region_right_of_use_code

结果如下:

这样就可以对应写入以下的Excel表

总结:关于报表,逻辑处理主要还是放在sql语句处理,尽量不要在java代码。

关于rollup 和cude 举例浅分析相关推荐

  1. 前端三大构建工具 Webpack、Vite、Rollup 优劣势及原理分析

    在刚刚结束的 VueConf2021 中,除了 Vue 3.0 以外,另外一个亮点就是下一代构建工具 Vite 了. 在尤雨溪分享的[ Vue 3 生态进展和计划]的演讲中,尤大神还特意提到 Vite ...

  2. 多线程中的死锁举例与分析(转)

    1. 一个特殊构造的程序 考虑下面这个专门为说明多线程中的死锁现象而构造的程序: import java.util.LinkedList;public class Stack {public stat ...

  3. 浅浅分析滤波器截止频率

    截止频率是描述滤波器性能的一个指标.对于一个滤波器,在其输入信号幅度保持不变的情况下,只改变输入信号的频率,当其输出信号幅度下降为输入信号幅度的0.707倍时,此时的频率即为该滤波器的截止频率. 一. ...

  4. 网络游戏软件销售渠道模式举例及分析

    转自:新浪游戏 http://games.sina.com.cn/y/n/2005-11-24/1425134038.shtml 本文主要以公司目前经营的重点业务--网络游戏为例,来举例说明当前市场上 ...

  5. 举例跟踪分析Linux内核5.0系统调用处理过程

    学号最后三位编号:094 原创作品转载请注明出处 + https://github.com/mengning/linuxkernel/ 0.实验内容 编译内核5.0 qemu -kernel linu ...

  6. 京东APP地址加密的浅分析

    第一次写博客 也是关于逆向方面的文章,首先将一些题外话,有很多人问我,我是小白我是新手,能不能也做到分析app的程度..其实 世上无难事 ,只怕有心人.一年前我连python都不知道是什么东西,所有我 ...

  7. UE5引擎 PC端的Landscape渲染浅分析

    前言 游戏目前发展趋势是大世界,而大世界必不可少的元素是大地形,UE引擎从地形系统有完善的渲染管线和工具链. Landscape的创建 UE的地形在LanscapeMode进行创建,如下所示 地形创建 ...

  8. Janus.js源码浅分析

    最近做了一个关于音视频的项目,对Janus有了一个初步的认识,期间查阅了许多资料,现在进行一个总结 下载Janus源码 git clone https://github.com/meetecho/ja ...

  9. Verilog语法中pullup.pulldown使用举例和分析

    在模拟IP仿真时,通常会使用到上拉.下拉电阻设置(此时还不是网表或hi spice仿真),其上拉电阻对应信号可赋值为1,下拉电阻赋值为0.因此会使用到pullup或pulldown.如下举例(引自某度 ...

  10. 微软Hololens设备 浅分析

    微软Hololens的定位是一款MR 设备(Mixed reality).MR与AR的不同我认为是MR能够将真实环境的场景信息与虚拟对象进行完美的融合,它是基于SLAM(SimultaneousLoc ...

最新文章

  1. PowerBuilder9对中文字符串的处理方法
  2. Java设计模式 - 适配器模式
  3. Eclipse 打开文件出现乱码情况总结
  4. CF1472(div3):总结
  5. HTTP 协议知识点总结(一)
  6. 【白皮书分享】2022数据中台交付标准化白皮书-阿里云+埃森哲.pdf(附下载链接)...
  7. 接口测试 Seldom 2.0 - 让接口自动化测试更简单
  8. filter-policy应用实验(华为设备)
  9. 如何使用火狐下的两款接口测试工具RESTClient和HttpRequester发送post请求
  10. 音频分析工具:zplane de​​​​​​​Coda for Mac
  11. 中国的底气在哪?我从优衣库发现了一个秘密
  12. 分类问题——逻辑回归与XGBoost
  13. 使用计算机的弊端,不可忽视的伤害 用电视接电脑弊端揭露
  14. 智能睡眠监控APP开发有哪些好处?
  15. 十七、网上商城项目(5)
  16. A. IQ test
  17. python程序实验教程_20192428 实验一《Python程序设计》实验报告
  18. 根本解决Python2中unicode编码问题
  19. 嵌入式系统概述2-嵌入式系统组成和应用
  20. 基于STM32开发板实现温湿度传感数据采集

热门文章

  1. Mac使用U盘重装系统
  2. 使用 ASP.NET 制作一个音乐网站
  3. 液晶屏控制器方案LT7680A
  4. 【爬虫】花瓣图片爬虫,Python图片采集下载源码
  5. C语言:判断一个数是不是素数(质数)
  6. 手把手刷数据结构-3.手把手刷二叉树算法1
  7. 前端 DFA 敏感词过滤
  8. APISpace 银行卡二要素API
  9. Casbin之基于角色的控制访问RBAC
  10. 供应链管理 MOOC学习笔记(全)