1、ROLLUP和CUBE函数,自动汇总数据
     select * from test_tbl的数据这样的
     col_a col_b col_c
     ---- ----- -----
     1     
b1   12
     1     
b1   2
     1     
b2   31
     2     
b2   7
     2     
b3   42
     2     
b3   1
     2     
b3   3
     如果按A、B列进行汇总C列,用一般的方法是这样:
     select col_a,col_b,sum(col_c) from
test_tbl group by col_a,col_b 结果如下
     col_a col_b sum(col_c)
     ---- ----- --------
     1     
b1    14
     1     
b2    31
     2     
b2    7
     2     
b3    46
    
但是如果这时候还想按A列汇总且要C列的合计数,那就要再用两个SQL来嵌套,很麻烦,不过用
rollup就简单多了:
     select nvl(col_a,'合计')
col_a,nvl(col_b,decode(col_a,null,'','小计'||col_a))
col_b,sum(col_c)
     from test_tbl group by
rollup(col_a,col_b),结果如下
     col_a col_b sum(col_c)
     ---- ----- --------
     1     
b1     14
     1     
b2     31
     1    小计1  
45
     2     
b2     7
     2     
b3     46
     2    小计2  
53
     合计 98
    
结果集刚好是先按A和B汇总,然后是按A汇总,最后是全部汇总这时候如果再要按B列汇总,怎么办
呢?又要用SQL嵌套吗?不是的,如果有这要求的话,改用cube函数就OK啦
     select
nvl(col_a,decode(col_b,null,'合计','小计'||col_b))
col_a,nvl(col_b,decode
(col_a,null,'','小计'||col_a)) col_b,sum(col_c)
     from test_tbl group by cube(col_a,col_b)
结果如下
     col_a col_b sum(col_c)
     ---- ----- --------
     1     
b1     14
     1     
b2     31
     1    小计1  
45
     2     
b2     7
     2     
b3     46
     2    小计2  
53
    小计b1  b1    14
    小计b2  b2    38
    小计b3  b3    46
    合计 98
    
跟刚才rollup函数得到的结果集有点不一样,那就是多了些按B列的汇总行。
    2、LAG和LEAD函数,自动链接上/下行记录值
     SQL> desc
test_tbl
     Name Type
     ----- ------
     COL_K NUMBER
     现在按顺序的往这个test_tbl表中插入一系列数据,下面是SQL:
     insert into test_tbl values(1)
     insert into test_tbl values(2)
     insert into test_tbl values(4)
     insert into test_tbl values(5)
     insert into test_tbl values(8)
     insert into test_tbl values(9)
     insert into test_tbl values(11)
     insert into test_tbl values(12)
     insert into test_tbl values(13)
     ........
    
数据插完后,要检查插入的数据中,从最小数到最大数之间有那些数是没被插入表,找出这些数的
前一个和后一个数?如这个例里从1到13当中有目字3、6、7、10没被插入表中,这些数的前一个和后一
个分别是2和4、5和8、9和11,即
     PREV_VAL NEXT_VAL
     ---------- ----------
     2 4
     5 8
     9 11
    
如果不用分析函数要得到这后结果集那真不敢想象是怎么样的一段SQL,但用LAG分析函数那就简单
了,这样写就OK
     select prev_val,next_val from(
     select col_k next_val,lag(col_k,1,0) over
(order by col_k) prev_val from test_tbl
     ) where
next_val-prev_val>1
     对于LEAD函数是一样的,只不过它是往后链接而已。
3、RANK和DENSE_RANK函数,对数据进行排名
     测试表是这样的select *from
test_tbl结集如下
     COL_A COL_B
     ---------- ----------
     A 242
     A 233
     B 154
     C 287
     C 76
     D 66
     E 154
     F 154
     G 212
     G 43
     按A列来统计B列的值,用一般的SQL是这样select col_a,
sum(col_b) from test_tbl group by
col_a order by 2 desc 结果是这样
     COL_A SUM(COL_B)
     ---------- ----------
     A 475
     C 363
     G 255
     B 154
     F 154
     E 154
     D 66
    
从这个数据集可以看出A是最大的,C是第二大的,当数据多时就不知道谁是排第几了,这时用
DENSE_RANK可以达到这目的
     select col_a,sum(col_b),dense_rank() over
(order by sum(col_b) desc) ranks from
test_tbl group by col_a 结果如下
     COL_A SUM(COL_B) RANKS
     ---------- ---------- ----------
     A 475 1
     C 363 2
     G 255 3
     B 154 4
     F 154 4
     E 154 4
     D 66 5
     这个数据集把每个值都排了名次,可以直接看得出,相同值的名次是相同的。
    
用RANK跟DENSE_RANK差不多,不过就是当出现在名次相同时,下一个名次会跳跃
     select col_a,sum(col_b),rank() over (order
by sum(col_b) desc ) ranks from test_tbl
group by col_a 结果如下
     COL_A SUM(COL_B) RANKS
     ---------- ---------- ----------
     A 475 1
     C 363 2
     G 255 3
     B 154 4
     F 154 4
     E 154 4
     D 66 7
     可以看到名次从4跳跃到7,就是因为名次4重复出现了两次
    
实际应用中可能会比这些例子要复杂多点,可能会先对表的数据分组,然后再用分析,如
     select *from test_tbl的结果是这样的
     COL_G COL_A COL_B
     ---------- ---------- ----------
     G1 A 242
     G1 A 233
     G2 C 287
     G2 C 76
     G2 D 66
     G2 E 154
     G3 F 154
     G3 G 212
     G3 G 43
     G2 B 154
    
对这个数据集按G和A列汇总B列进行排名,就要先对表按G列进行分组,然后再按A列汇总B列值进行
排名
     select col_g,col_a,sum(col_b),dense_rank()
over (partition by col_g order by sum
(col_b) desc ) ranks
     from test_tbl
     group by col_g,col_a这个SQL加了partition
by先按G列分组,结果如下
     COL_G COL_A SUM(COL_B) RANKS
     ---------- ---------- ----------
----------
     G1 A 475 1
     G2 C 363 1
     G2 B 154 2
     G2 E 154 2
     G2 D 66 3
     G3 G 255 1
     G3 F 154 2
     可以看到名次都是在G列的组别发生变化时,就会重新开始新排列
;
 

分组求和SQL示例的更多相关文章

  1. Sql示例说明如何分组后求中间值--【叶子】

    原文:Sql示例说明如何分组后求中间值--[叶子] 这里所谓的分组后求中间值是个什么概念呢? 我举个例子来说明一下: 假设我们现在有下面这样一个表: type        name price -- ...

  2. 查询统计SQL分组求和使用小技巧

    我们在做查询统计时,肯定会遇到将查询结果再次分组求和这种需求,但是往往查询的sql本身就比较复杂,再使用分组函数不太可能,那么这时候我们就想到了用临时表的办法,通过联合临时表我们就可以获得想要的分组求 ...

  3. Oracle函数over(),rank()over()作用及用法--分区(分组)求和& 不连续/连续排名

    (1)   函数:  over()的作用及用法:    -- 分区(分组)求和. RANK ( ) OVER ( [query_partition_clause] order_by_clause )D ...

  4. Oracle分析函数及常用函数: over(),rank()over()作用及用法--分区(分组)求和& 不连续/连续排名

    (1)   函数:  over()的作用及用法:    -- 分区(分组)求和. sum() over( partition by column1 order by column2 )主要用来对某个字 ...

  5. awk 分组求和

    awk 分组求和 分组求和 awk '{s[substr($2,1,6)] += $1} END{for(i in s) {print i, s[i]/(1024*1024*1024)} }' fil ...

  6. Laravel/Lumen 分组求和问题 where groupBy sum

    在Laravel中使用分组求和,如果直接使用Laravel各数据库操作方法,应该会得出来如下代码式: DB::table('table_a') ->where('a','=',1) ->g ...

  7. linq分组求和_实体类和datatable

    1.数据分组求合,分别用的实体类以及datatable来分组求合,还有分组求和之后的如何取值 //实体类版本 List<ProgramTimeModel> TotalAllList = G ...

  8. mssql sqlserver两条求和sql脚本相加的方法分享

    转自:http://www.maomao365.com/?p=7205 摘要: 下文分享两条sql求和脚本,再次求和的方法分享 /* 例: 下文已知两条sql求和脚本,现需对两张不同表的求和记录再次求 ...

  9. 做项目单个功能的时候要理解需求和sql语句。

    做项目单个功能的时候要理解需求和sql语句.最好直接按照给出来的sql语句或者存储过程来写,避免有极其细微的差别所造成的不同. 做宜春国税二期的时候有个功能叫夜间开票情况,钻取明细时由于没理解sql语 ...

随机推荐

  1. javascript中算术运算符规则

    javascript中提供了几种算术运算符,+(加)  -(减)  *(乘)  /(除)  %(余),常规用法与数学上的一致:  但还规定一些特殊规则: 注:JavaScript中保存数值的方式,可以 ...

  2. [转]spring 监听器 IntrospectorCleanupListener简介

    "在服务器运行过程中,Spring不停的运行的计划任务和OpenSessionInViewFilter,使得Tomcat反复加载对象而产生框架并用时可能产生的内存泄漏,则使用Introspe ...

  3. C - Wooden Sticks

    C - Wooden Sticks Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u S ...

  4. Spark源码学习3

    转自:http://www.cnblogs.com/hseagle/p/3673132.html 一.概要 本篇主要阐述在TaskRunner中执行的task其业务逻辑是如何被调用到的,另外试图讲清楚 ...

  5. c#实现pdf另存为功能

    c#实现pdf另存为功能 /// <summary> /// PDF另存为效果 /// </summary> /// <param name="fileName ...

  6. 关于express4不再支持body-parser

    express的bodyParser能将表单里的数据格式化,bodyParser原是绑定在express中的,但从express4开始,不在绑定了 如果依然直接使用app.use(express.bo ...

  7. hadoop搭建杂记:Linux下hadoop的安装配置

    VirtualBox搭建伪分布式模式:hadoop的下载与配置 VirtualBox搭建伪分布式模式:hadoop的下载与配置 由于个人机子略渣,无法部署XWindow环境,直接用的Shell来操作, ...

  8. Linux Apache绑定多域名

    1 网上查到资源不符 网上查到的Apache绑定域名都说要修改http.conf文件,但是我的服务器上的apache是通过apt-get install安装的,安装方法应该是没错的,但是通过find ...

  9. FTL(Flash translation layer)闪存转换层

    前面说过,闪存的读写单位为页,而页的大小一般为4KB或8KB,但我们的操作系统读写数据是按HDD的扇区尺寸进行的(512Byte(字节)),更麻烦的是闪存擦除以块作单位,而且未擦除就无法写入,这导致操 ...

  10. 网页解析不了PHP源代码的解决方法

    一般出现这个错误都是因为修改了apache配置文件,但是没有使apache配置生效. 所以只要执行以下命令就行了: sudo apachectl restart sudo apachectl grac ...