[英]Get the count of active employees in a given quarter
我需要為這里提到的用例提出一個查詢。
員工表
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
細節
上面Employee_Table上傳新季度數據時,新季度插入Quarter_list_table
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.