如何用Oracle实现组织结构中的汇总统计

运维 数据库运维 数据库
汇总统计是数据处理中常见的一个操作,如何在Oracle中实现这一常见操作,本文将给大家提供一种切实可行的方法。

对于一般的数据模型来说,一般是有一个事实表,若干个维度表,通过事实表与维度表的连接,实现不同层次的查询汇总。

问题是对于组织结构而言,一般所有的数据都存贮于一个表中,而且,组织结构的层次也是动态的。那么,在这种情况下,如何实现员工工资的汇总呢?一个比较有趣的问题是: 如何统计员工及其所有被管理员工的总工资,举个例子,CEO的总工资就是整个公司总有员工的总工资之和,包括他自己。

Oracle 引入了一个扩展的运算符,专门用来处理此种情形,它就是connect_by_root。当以connect_by_root修饰一个列名时,Oracle将返回根节点对应的此列的值。例如,当start with 为 last_name = ‘King’时,这时返回的所有行的connect_by_root last_name的值都将为’King’。这时,对所有行的累计就是对’King’的数据的累计了。当不指定start with 子句时,Oracle将对每个节点依次进行遍历,于是,我们可以对返回的结果对last_name进行一次group by,那么我们就得到了所有last_name对应的汇总工资了。

下面是Oracle 文档中的例子。


The following example returns the last name of each employee in department 110, each manager 
  • 1.
  • 2.
above that employee in the hierarchy, the number of levels between manager and employee, 
  • 1.
and the path between the two: 
  • 1.
  • 1.

SELECT last_name "Employee", CONNECT_BY_ROOT last_name "Manager",    LEVEL-1 "Pathlen", SYS_CONNECT_BY_PATH(last_name, '/') "Path"    FROM employees    WHERE LEVEL > 1 and department_id = 110    CONNECT BY PRIOR employee_id = manager_id    ORDER BY "Employee", "Manager", "Pathlen", "Path";

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.

Employee        Manager            Pathlen Path --------------- --------------- ---------- ------------------------------ Gietz           Higgins                  1 /Higgins/Gietz Gietz           King                     3 /King/Kochhar/Higgins/Gietz Gietz           Kochhar                  2 /Kochhar/Higgins/Gietz Higgins         King                     2 /King/Kochhar/Higgins Higgins         Kochhar                  1 /Kochhar/HigginsThe following example uses a GROUP BY clause to return the total salary of each employee in department 110 and all employees below that employee in the hierarchy:

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

SELECT name, SUM(salary) "Total_Salary" FROM (    SELECT CONNECT_BY_ROOT last_name as name, Salary       FROM employees       WHERE department_id = 110       CONNECT BY PRIOR employee_id = manager_id)       GROUP BY name    ORDER BY name, "Total_Salary";

NAME                      Total_Salary ------------------------- ------------ Gietz                             8300 Higgins                          20300 King                             20300 Kochhar                          20300

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.

【编辑推荐】

  1. Oracle应用开发中的几个经典问题
  2. Oracle数据空间的使用、监控和维护
  3. Oracle数据库管理脚本浅析
责任编辑:彭凡 来源: OS Oracle
相关推荐

2011-08-30 17:33:10

OracleSAS宏

2021-08-08 22:08:41

Redis开发网页

2011-03-02 15:35:15

Oracle分组统计

2011-07-13 14:02:42

OracleExcel

2023-12-05 07:26:21

Golang项目结构

2010-04-15 13:10:09

Oracle系统结构

2010-04-20 14:06:56

Oracle SQL语

2011-07-22 13:22:10

Java.NETDataTable

2010-05-10 14:16:50

Oracle树结构

2009-03-26 09:24:36

Oracle外键数据库

2011-03-15 09:10:47

iptablesNAT

2025-02-04 09:58:08

2011-07-05 08:56:43

JavaScript

2019-08-01 15:08:37

PythonLine操作系统

2011-03-15 14:26:23

iptablesNAT

2011-07-18 14:00:29

RailsOracle

2022-12-05 16:38:48

Python统计信息预测模型

2011-10-13 09:44:49

MySQL

2011-06-22 16:52:07

Oracle云计算

2011-05-30 10:36:49

MySQL
点赞
收藏

51CTO技术栈公众号