connect by和pivot一起使用的例子
时间: 2024-04-07 13:33:28 浏览: 76
Connect by 和 Pivot 是 Oracle SQL 中的两个功能,它们可以一起使用来实现对数据的递归查询和转置操作。
下面是一个示例,演示了如何使用 Connect by 和 Pivot 来实现数据的递归查询和转置操作:
假设我们有一个名为 EMPLOYEES 的表,其中包含员工的层级关系和薪水信息:
```
EMPLOYEE_ID EMPLOYEE_NAME MANAGER_ID SALARY
1 John NULL 5000
2 Alice 1 3000
3 Bob 2 2000
4 Carol 2 2500
5 David 1 4000
```
我们想要对这个表进行递归查询,以显示每个员工及其所有下属的总薪水,并将结果以转置的形式显示出来。
使用 Connect by 和 Pivot 可以实现这个需求,示例代码如下:
```
SELECT * FROM (
SELECT
LEVEL AS LEVEL_NUM,
LPAD(' ', (LEVEL - 1) * 4, ' ') || EMPLOYEE_NAME AS EMPLOYEE,
SUM(SALARY) AS TOTAL_SALARY
FROM
EMPLOYEES
START WITH
MANAGER_ID IS NULL
CONNECT BY
PRIOR EMPLOYEE_ID = MANAGER_ID
GROUP BY
LEVEL,
EMPLOYEE_NAME
)
PIVOT (
MAX(TOTAL_SALARY) AS TOTAL_SALARY
FOR LEVEL_NUM IN (1, 2, 3, 4) -- 假设最多4层
)
ORDER BY EMPLOYEE;
```
上述代码中,我们首先使用 Connect by 子句进行递归查询,通过指定 START WITH 和 CONNECT BY 子句来定义递归的起点和关系。然后,我们使用子查询计算每个员工及其所有下属的总薪水,并使用 LEVEL 来表示层级关系。
接下来,我们使用 Pivot 子句来实现转置操作,将不同层级的总薪水作为列进行展示。
最后,我们通过外部查询对结果进行排序,并按照员工名称进行显示。
请注意,上述示例中的表和数据仅为演示目的,实际使用时需要根据实际情况进行调整。此外,Pivot 子句中的列名和层级数需要根据实际情况进行定义和调整。
阅读全文