簡體   English   中英

獲取給定季度在職員工的數量

[英]Get the count of active employees in a given quarter

我需要為這里提到的用例提出一個查詢。

員工表

  1. 如果員工在當前(最新)季度不再存在,則狀態為非活動狀態
  2. 更新 (qtr) 值作為數據上傳的一部分插入
  3. 第一次插入行時添加創建的值。
Emp_Name    id  created  updated  status
a            1  Q1FY20   Q1FY21   ACTIVE
b            2  Q1FY20   Q1FY21   ACTIVE
c            3  Q2FY20   Q4FY20   INACTIVE
d            4  Q2FY20   Q3FY20   INACTIVE
e            5  Q1FY21   Q1FY21   ACTIVE

Quarter_list_table

Id (randomly generated incremental)                qtr

1                                                  Q1FY20
2                                                  Q2FY20
3                                                  Q3FY20
4                                                  Q4FY20
5                                                  Q1FY21

細節

  1. 上面Employee_Table上傳新季度數據時,新季度插入Quarter_list_table

  2. Id 是隨機生成的,但以增量方式生成。 因此,在任何時候,最新的 qtr 都將具有最高的 id 值。

現在我需要計算每個季度的活躍員工數並將其顯示在條形圖中。 我只知道每個員工都應該算作存在於所有季度之間(包括創建和更新的 qtr 值)。 但是,我無法提出 sql 來獲取每個 qtr 中活躍員工的數量。

Quarter_List_Table創建一個視圖,然后它將與Employees表同步。

CREATE VIEW Quarter_list_table ( id, qtr ) AS
SELECT ROWNUM,
       qtr
FROM   (
  SELECT DISTINCT
         qtr
  FROM   employees
  UNPIVOT ( qtr FOR type IN ( created, updated ) )
  ORDER BY SUBSTR( qtr, -2 ), SUBSTR( qtr, 2, 1 )
)

其中,對於您的示例數據:

CREATE TABLE employees ( Emp_Name, id, created, updated, status ) AS
SELECT 'a', 1, 'Q1FY20', 'Q1FY21', 'ACTIVE' FROM DUAL UNION ALL
SELECT 'b', 2, 'Q1FY20', 'Q1FY21', 'ACTIVE' FROM DUAL UNION ALL
SELECT 'c', 3, 'Q2FY20', 'Q4FY20', 'INACTIVE' FROM DUAL UNION ALL
SELECT 'd', 4, 'Q2FY20', 'Q3FY20', 'INACTIVE' FROM DUAL UNION ALL
SELECT 'e', 5, 'Q1FY21', 'Q1FY21', 'ACTIVE' FROM DUAL;

表示視圖包含:

\n身份證 | 季度收視率   \n -: |  :-----\n  1 |  2020 財年第一季度\n  2 |  2020 財年第二季度\n  3 |  2020 財年第三季度\n  4 |  2020 財年第 4 季度\n  5 |  21 財年第一季度\n

然后您可以FY20Q1兩個表連接在一起並匯總以獲得您的計數(如果您的季度寫為FY20Q1那么您可以只使用字母數字比較......但我們可以交換它以利用那):

SELECT MAX(q.qtr) AS qtr,
       COUNT( DISTINCT e.id ) AS cnt
FROM   Quarter_List_Table q
       LEFT OUTER JOIN employees e 
       ON ( SUBSTR( q.qtr, 3 ) || SUBSTR( q.qtr, 1, 2 )
              BETWEEN SUBSTR( e.created, 3 ) || SUBSTR( e.created, 1, 2 )
              AND     SUBSTR( e.updated, 3 ) || SUBSTR( e.updated, 1, 2 )
            AND e.status = 'ACTIVE'
          )
GROUP BY q.id
ORDER BY q.id

哪些輸出:

\n QTR | 碳納米管\n :----- |  ——:\n 2020 財年第一季度 |  2\n Q2FY20 |  2\n Q3FY20 |  2\n Q4FY20 |  2\n 2021 財年第一季度 |  3\n

db<> 在這里擺弄


或者,您可能希望使用行生成器來創建最小值和最大值之間的所有季度:

CREATE VIEW Quarter_list_table ( id, qtr ) AS
SELECT LEVEL,
       TO_CHAR(
         ADD_MONTHS( min_qtr, 3 * LEVEL - 3 ),
         '"Q"Q"FY"YY'
       )
FROM   (
  SELECT MIN(
           ADD_MONTHS(
             DATE '1999-10-01',
             3 * SUBSTR( qtr, 2, 1 ) + SUBSTR( qtr, -2 ) * 12 
           )
         ) AS min_qtr,
         MAX(
           ADD_MONTHS(
             DATE '1999-10-01',
             3 * SUBSTR( qtr, 2, 1 ) + SUBSTR( qtr, -2 ) * 12 
           )
         ) AS max_qtr
  FROM   employees
  UNPIVOT ( qtr FOR type IN ( created, updated ) )
)
CONNECT BY ADD_MONTHS( min_qtr, level * 3 - 3 ) <= max_qtr;

db<> 在這里擺弄

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM