【问题标题】:How to Get count of active employees (in all months)如何获取活跃员工的数量(所有月份)
【发布时间】:2019-07-14 14:14:51
【问题描述】:

我正在尝试在(Fusion BI 报告)中创建 HCM 报告,以检索所选年份“所有月份”的员工人数。

在当前情况下,当我们运行“2017”报告时,它会检索 7 月、8 月、9 月的员工总数

需要什么: 当参数 = '2017' AND 9 月之后的月份为 null 时,获取最后一个存在的值,即 'Sept' 中的值

Month Name   Current result    Expected result
July          1                 1
Aug           3                 3 
Sept          4                 4
Oct                             4
Nov                             4
Dec                             4

我的查询

SELECT PIVOT_TBL.* FROM
(SELECT
        COUNT(PAPF.PERSON_ID) OVER (ORDER BY  TO_CHAR(PAPF.START_DATE,'MM-YYYY')) AS OP_BALANCE,
        EXTRACT (MONTH FROM PAPF.START_DATE)  AS OMONTHS


 FROM
        PER_ALL_PEOPLE_F          PAPF,
        PER_ALL_ASSIGNMENTS_M     PAAM,   
        PER_PERSONS               PP  

WHERE     
        PAAM.PERSON_ID              =  PAPF.PERSON_ID
    AND PP.PERSON_ID                =  PAPF.PERSON_ID  
    ------------------------------------------------ 
    AND PAAM.ASSIGNMENT_TYPE        =  'E'
    AND PAAM.PRIMARY_FLAG           =  'Y'  
    AND PAAM.EFFECTIVE_LATEST_CHANGE = 'Y' 
    AND PAAM.ASSIGNMENT_STATUS_TYPE  = 'ACTIVE'
    -------------------------------------------------
    AND TRUNC(SYSDATE) BETWEEN PAPF.EFFECTIVE_START_DATE    AND  PAPF.EFFECTIVE_END_DATE 
    AND TRUNC(SYSDATE) BETWEEN PAAM.EFFECTIVE_START_DATE    AND  PAAM.EFFECTIVE_END_DATE  
    AND TO_CHAR(PAPF.START_DATE,'YYYY')='2017'
    ORDER BY 2)SRC_TABLE

    PIVOT
    (MAX(OP_BALANCE) AS EJ FOR OMONTHS IN
    ('1' AS JAN , '2' AS FEB , '3' AS MAR , '4'  AS APR , '5'  AS MAY , '6'  AS JUNE ,
     '7' AS JUL , '8' AS AUG , '9' AS SEPT, '10' AS OCTO, '11' AS NOV , '12' AS DECE)
    )PIVOT_TBL

【问题讨论】:

    标签: sql oracle fusion


    【解决方案1】:

    您必须以某种方式确保所有月份都存在,然后使用 LAST_VALUE() 函数和 IGNORE NULLS 将最后一个非空值复制到后面的月份。

    var yr number;
    exec :yr := 2017;
    with raw_results(dte, rslt) as (
      select date '2017-07-01', 1 from dual union all
      select date '2017-08-01', 3 from dual union all
      select date '2017-09-01', 4 from dual
    )
    , min_dte as (
      select min(dte) dte from raw_results
      where dte >= trunc(to_date(:yr,'yyyy'), 'yy')
    )
    , months as (
      select add_months(dte, level-1) dte
      from min_dte
      connect by extract(year from add_months(dte, level-1)) = :yr
    )
    select to_char(dte, 'Mon') "Month", 
      last_value(rslt ignore nulls) over(order by dte) "Result"
    from months
    left join raw_results using(dte);
    
    Month            Result
    ------------ ----------
    Jul                   1
    Aug                   3
    Sep                   4
    Oct                   4
    Nov                   4
    Dec                   4
    

    【讨论】:

    • 错误:SQL 查询时间超过限制 (500)。已停止处理。
    • 很好的解决方案。
    【解决方案2】:

    通过提取连接(年份来自 add_months(dte, level-1)) = :yr ) 选择 to_char(dte, 'Mon') "月", last_value(rslt 忽略空值) over(order by dte) "Result" 从几个月 left join raw_results using(dte);

    月份结果


    7 月 1 日 8 月 3 日 9月4日 10 月 4 日 11 月 4 日 12 月 4 日

    【讨论】:

      猜你喜欢
      • 2018-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-21
      • 1970-01-01
      • 2017-10-08
      相关资源
      最近更新 更多