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

*************资产状态*****************
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. nginx的反向代理及负载均衡
  2. 手机电脑同屏_骚操作!手机秒变触摸电脑、扩展屏幕!
  3. poj3278 【BFS】
  4. 实例55:python
  5. RESTful Request:GET/PUT/DELETE/POST/HEAD/OPTIONS
  6. UART通讯协议(四)数据接收帧间隔
  7. VC和gcc在保证功能static对线程安全的差异变量
  8. 在Eclipse中创建java类的注释模板
  9. 自定义 feign 调用实现 hystrix 超时、异常熔断
  10. 计算机分析桁架受力,结构力学教学中桁架的概念分析与实践
  11. (10)ERStudio
  12. 华为2019届校招笔试题
  13. eaxsinbx_高等数学导数与微分练习题
  14. cadence 17.2 入门学习2 allegro
  15. 内核手动释放内存方法
  16. 第三周项目 侦察队委派任务
  17. Linux下使用icq(转)
  18. 如何提升w ndows10系统网速,Win10专业版系统网速慢的解决方法
  19. 韦东山 IMX6ULL和正点原子_正点原子Linux第五十七章Linux MISC驱动实验
  20. 自学php看什么视频,PHP自学要多久?看了这11部php视频教程,你就是高手

热门文章

  1. SOLARIS SYSTEM COMMAND(个人整理笔记)
  2. mysql数据库分页查询,limit语句用法
  3. 《大象 Thinking in UML》学习笔记(三)——UML核心元素之参与者、用例
  4. 用gambit学博弈论--完全信息动态博弈-参与者信息集、博弈树上虚线的解释(三)
  5. 有效解决jdbc连接mysql提示Access denied for user ‘‘@‘localhost‘ to database ‘mysql1‘
  6. Fresco图片库研读分析
  7. 计算机英语形成性考核册,开放英语1形成性考核册答案(中央广播电视大学外语部)doc...
  8. APP推广第一步:五大ASO优化方法
  9. STM32—建立工程模板
  10. Nature子刊:大脑在局部区域的结构-功能耦合的遗传度与个体差异