有的需求实现起来并不复杂,关键是要结合所掌握的知识,把需求和知识融在一起,能想到好的思路才是王道。
先看一点测试数据:
1 2 3 4 5 6 7 |
SQL> select * from TESTBBB t; SHANGJI XIAJI QISHU PRICE ---------- ---------- ---------- ---------- 1 2 201501 100 2 3 201501 200 1 4 201502 300 4 5 201503 400 |
测试数据很简单,shangji表示的就是上级用户,xiaji表示当前用户的下级,qishu表示当前是多少期,price表示绩效。
需要实现的结果如下:
1 2 3 4 5 6 7 |
SHANGJI QISHU PRICE ---------- ---------- ---------- 1 201501 300 1 201502 300 1 201503 400 2 201501 200 4 201503 400 |
从需要实现的结果来看,1这个用户,期数为201503的时候,在源数据当中并没有对应的数据,但因为4是1的下级,所以4这个用户在201503这一期的绩效也是1用户在201503这一期的绩效。也就是说,当期A用户的绩效等于当期所有A用户下级绩效的总和加上A用户本身的绩效。肯定需要用到的是oracle的递归查询,直接看写法:
1 2 3 4 5 6 7 8 9 10 |
SQL> select shangji,qishu,sum(price) price from 2 (select connect_by_root shangji as shangji,qishu,price from testbbb connect by shangji=prior xiaji) 3 group by shangji,qishu order by 1,2; SHANGJI QISHU PRICE ---------- ---------- ---------- 1 201501 300 1 201502 300 1 201503 400 2 201501 200 4 201503 400 |
首先通过递归查询,查询当前上级用户,期数和绩效,然后在外层直接sum聚合就ok。这里只是一个简单的查询例子,oracle的递归查询可以结合很多函数一起使用达到意想不到的效果。
- 本文固定链接: http://www.savedba.com/?p=893
- 转载请注明: 版权所有,文章允许转载,但必须以链接方式注明源地址,否则追究法律责任!
哈 谢谢啦 !谢谢分享