分组求和SQL示例
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列,用一般的方法是这样:
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来嵌套,很麻烦,不过用
select nvl(col_a,'合计')
col_a,nvl(col_b,decode(col_a,null,'','小计'||col_a))
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列汇总,怎么办
nvl(col_a,decode(col_b,null,'合计','小计'||col_b))
col_a,nvl(col_b,decode
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列的汇总行。
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)
........
数据插完后,要检查插入的数据中,从最小数到最大数之间有那些数是没被插入表,找出这些数的
PREV_VAL NEXT_VAL
---------- ----------
2 4
5 8
9 11
如果不用分析函数要得到这后结果集那真不敢想象是怎么样的一段SQL,但用LAG分析函数那就简单
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函数是一样的,只不过它是往后链接而已。
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 SUM(COL_B)
---------- ----------
A 475
C 363
G 255
B 154
F 154
E 154
D 66
从这个数据集可以看出A是最大的,C是第二大的,当数据多时就不知道谁是排第几了,这时用
select col_a,sum(col_b),dense_rank() over
(order by sum(col_b) desc) ranks from
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
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
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示例的更多相关文章
- Sql示例说明如何分组后求中间值--【叶子】
原文:Sql示例说明如何分组后求中间值--[叶子] 这里所谓的分组后求中间值是个什么概念呢? 我举个例子来说明一下: 假设我们现在有下面这样一个表: type name price -- ...
- 查询统计SQL分组求和使用小技巧
我们在做查询统计时,肯定会遇到将查询结果再次分组求和这种需求,但是往往查询的sql本身就比较复杂,再使用分组函数不太可能,那么这时候我们就想到了用临时表的办法,通过联合临时表我们就可以获得想要的分组求 ...
- Oracle函数over(),rank()over()作用及用法--分区(分组)求和& 不连续/连续排名
(1) 函数: over()的作用及用法: -- 分区(分组)求和. RANK ( ) OVER ( [query_partition_clause] order_by_clause )D ...
- Oracle分析函数及常用函数: over(),rank()over()作用及用法--分区(分组)求和& 不连续/连续排名
(1) 函数: over()的作用及用法: -- 分区(分组)求和. sum() over( partition by column1 order by column2 )主要用来对某个字 ...
- awk 分组求和
awk 分组求和 分组求和 awk '{s[substr($2,1,6)] += $1} END{for(i in s) {print i, s[i]/(1024*1024*1024)} }' fil ...
- Laravel/Lumen 分组求和问题 where groupBy sum
在Laravel中使用分组求和,如果直接使用Laravel各数据库操作方法,应该会得出来如下代码式: DB::table('table_a') ->where('a','=',1) ->g ...
- linq分组求和_实体类和datatable
1.数据分组求合,分别用的实体类以及datatable来分组求合,还有分组求和之后的如何取值 //实体类版本 List<ProgramTimeModel> TotalAllList = G ...
- mssql sqlserver两条求和sql脚本相加的方法分享
转自:http://www.maomao365.com/?p=7205 摘要: 下文分享两条sql求和脚本,再次求和的方法分享 /* 例: 下文已知两条sql求和脚本,现需对两张不同表的求和记录再次求 ...
- 做项目单个功能的时候要理解需求和sql语句。
做项目单个功能的时候要理解需求和sql语句.最好直接按照给出来的sql语句或者存储过程来写,避免有极其细微的差别所造成的不同. 做宜春国税二期的时候有个功能叫夜间开票情况,钻取明细时由于没理解sql语 ...
随机推荐
- javaScript操作select
注意:Option中的O是要大写的,不然语法报错 1.动态创建select function createSelect(){ var mySelect = document.createE ...
- ItextSharp代码示例
示例代码目录 示例代码0101. 5 示例代码0102. 7 示例代码0103. 9 示例代码0104. 11 示例代码0105. 13 示例代码0106. 15 示例代码0107. 17 示例代码0 ...
- jQuery插件开发方法
jQuery如此流行,各式各样的jQuery插件也是满天飞.你有没有想过把自己的一些常用的JS功能也写成jQuery插件呢?如果你的答案是肯定的,那么来吧!和我一起学写jQuery插件吧! 很多公司的 ...
- 基于Nodejs开发的web即时聊天工具
由于公司需要开发web即时聊天的功能,开始时我们主要的实施方法是用jquery的ajax定时(10秒)轮询向服务器请求,由于是轮询请求,对 服务器的压力比较大.我们网站上线的时间不长,访问量不是很大, ...
- C++中#include的工作原理
大多数人可能对“#include”比较熟悉,因为我们写C/C++程序的时候都会写的字符串之一,但是它是具体怎么工作的?或者它的原理是什么呢? 可能不太熟悉,也有可能没有去关心过.我们只关心程序能否正确 ...
- MSSQL数库备份与还原脚本(多个库时很方便)
每次通过 Management Studio 的界面操作备份或还原数据库,对于单个数据库还好,要是一次要做多个.那就还是用脚本快些,下面有两段脚本分享一下. ===================== ...
- JDK源码学习--String篇(四) 终结篇
StringBuilder和StringBuffer 前面讲到String是不可变的,如果需要可变的字符串将如何使用和操作呢?JAVA提供了连个操作可变字符串的类,StringBuilder和Stri ...
- c++ 11 vs 98
在求最长子字符串中题中要遍历个上万字符数据 1.使用c++11代码 for (auto ch : s) { auto ss = vsi[ch]; vsi[ch].insert(i); i++; } 2 ...
- ThinPHP第二十八天(F函数和file_put_contents区别|PHP生成PHP文件,Kindeditor编辑器使用方法)
1.F(name,data,path)函数和file_put_contents(file,str)区别 F函数直接生成<?php ?>格式的php文件了,将data加入到<?php和 ...
- Groovy在不同JDK版本下的性能差异
Groovy作为一种动态语言,性能和JAVA比肯定是差不少,根据网友的测试,由于测试环境,场景和编译参数的不同,大概有差2到7倍的差距 那么同样的Groovy,在不同的JDK版本下,会有着怎样的差异呢 ...