PLSQL中有很多高级分析函数,可以很简单的处理很复杂的数学运算。
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函数是一样的,只不过它是往后链接而已。[@more@]
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函数是一样的,只不过它是往后链接而已。[@more@]
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10253675/viewspace-921576/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/10253675/viewspace-921576/