Oracle SQL - 根据数量列生成行

问题描述

我们使用分配了最大人数的合并职位,我需要构建一份报告,为每个负责人创建一行,包括在职人员的详细信息(如果有一个或空行的空缺行)。

>

像这样:

Position_Title 人数 现任
分析师 3 员工 1
分析师 3 员工 2
分析师 3

我可以将 Person/Assignment 表与 Position 表连接起来,以生成一个单独的行,其中有一个在职者,但我正在努力解决的部分是生成一个有空缺的行。

在这里发现另一个 post 建议使用 connect by,但我无法让它工作。

它似乎是这样独立工作的:

SELECT

HAP.NAME POSITION_TITLE,HAP.POSITION_CODE,HAP.ACTIVE_STATUS,HAP.POSITION_TYPE,HAP.FTE,LEVEL row_num

FROM

HR_ALL_POSITIONS_F_VL HAP


CONNECT BY LEVEL <= HAP.FTE
AND PRIOR HAP.POSITION_ID = HAP.POSITION_ID
AND PRIOR sys_guid() IS NOT NULL

但我不确定如何将它与查询的其余部分一起使用(我曾尝试在 WHERE 前后使用 CONNECT BY 子句,但无论哪种方式它都会超时)

>
SELECT 
HAP.NAME POSITION_TITLE,PGF.NAME GRADE_NAME,PGF.GRADE_CODE,HAP.HEADCOUNT,PAAM.ASSIGNMENT_NUMBER,LEVEL row_num

FROM
HR_ALL_POSITIONS_F_VL HAP,PER_GRADES_F_VL PGF,PER_ALL_ASSIGNMENTS_M PAAM

WHERE 

    HAP.ENTRY_GRADE_ID = PGF.GRADE_ID
AND PAAM.POSITION_ID(+) = HAP.POSITION_ID
AND      Trunc(Sysdate) between HAP.effective_start_date AND HAP.effective_end_date
AND      Trunc(Sysdate) between PGF.effective_start_date AND PGF.effective_end_date
AND      PAAM.effective_start_date(+) <= Trunc(Sysdate)
AND      PAAM.effective_end_date(+) >= Trunc(Sysdate)

CONNECT BY LEVEL <= HAP.HEADCOUNT
AND PRIOR HAP.POSITION_ID = HAP.POSITION_ID
AND PRIOR sys_guid() IS NOT NULL

解决方法

您可以使用 multiset 根据 headcount 列生成行,如下所示:

SELECT 
HAP.NAME POSITION_TITLE,HAP.POSITION_CODE,PGF.NAME GRADE_NAME,PGF.GRADE_CODE,HAP.ACTIVE_STATUS,HAP.POSITION_TYPE,HAP.HEADCOUNT,PAAM.ASSIGNMENT_NUMBER,Lvls.Column_value row_num

FROM
HR_ALL_POSITIONS_F_VL HAP,PER_GRADES_F_VL PGF,PER_ALL_ASSIGNMENTS_M PAAM,table(cast(multiset(select level from dual connect by  level <= hap.headcount) as sys.OdciNumberList)) lvls
WHERE 

    HAP.ENTRY_GRADE_ID = PGF.GRADE_ID
AND PAAM.POSITION_ID(+) = HAP.POSITION_ID
AND      TRUNC(Sysdate) between HAP.effective_start_date AND HAP.effective_end_date
AND      TRUNC(Sysdate) between PGF.effective_start_date AND PGF.effective_end_date
AND      PAAM.effective_start_date(+) <= TRUNC(Sysdate)
AND      PAAM.effective_end_date(+) >= TRUNC(Sysdate);

注意:根据您的要求添加条件,并始终使用标准的 ANSI 连接。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...