获取分层数据

时间:2017-07-09 12:00:34

标签: sql oracle

我的表格如下:

emp id | post  | manager id
----------------------------
1       | l1   | 2
2       | l2   | 3
4       |l1    | 2
3       | l3   | null
-----------------------------

我还有另一张表:

emp id | target achived | given target | 
----------------------------------------
1      |  200            |  300
---------------------------------------
4      |  400            | 500

我有一个发出通知的功能,比如

l1 id----target achived/target given

1,200 / 300 4,400 / 500

(上面提到的通知emp id 2将获得,谁是l2) 所有l2都会收到这样的通知。

l3只会获得l2的短信 对于给定的情况l2目标achived =所有目标由他的所有l1

获得

所以emp id 3会变得像--------

empid 2--- 2, 600/800

如何设计查询是一种通用的方式,层次结构的深度可以是任何东西。实际工作仅由l1完成。 通知将像 - l2只会获得自己l1的结果。 l3将得到他自己的l2(相应的l1的结果的总和)和相应的l2 sms的结果......所以......

1 个答案:

答案 0 :(得分:0)

在Oacle中,您有“已连接”来运行分层查询。

以下是AskTom关于此主题的链接。您还可以谷歌“Oracle Connected By”。

CONNECT BY basics

我没有安装Oracle,所以我无法测试它,但这是你可以通过经理获得实现/目标总数的方法:

获取经理的经理报告的分层结果。 获取每个经理的统计数据,就像他们是自己的老板一样,以便将信息包含在他们自己的报告中。 联盟两套信息。 并由经理总结信息。

同样,查询可能会出现拼写错误,但所提出的策略应该有效。

select sum(c_achieved), sum(c_target), c_manager
from
(
  -- Get the metrics of each manager's reports
  select all_info.t_achieved c_achieved, all_info.t_target c_target, all_info.manager c_manager 
  from
    (select emp_id, post, manager, t_achieved, t_target 
    from emps, targets
    where emps.emp_id = targets.emp_id) all_info
  start with all_info.manager is null
  connect by prior all_info.emp_id = all_info.manager
  union
  --Get the metrics of the managers to add them to themelves
  select all_info2.t_achieved, all_info2.t_target, all_info2.emp_id
  from 
    (select null, post, emp_id, t_achieved, t_target 
    from emps, targets
    where emps.emp_id in (select distinct manager from emps) all_info_2
  where all_info_2.emp_id = all_info_2.manager
) stats_by_manager
group by c_manager