获取给定季度的活跃员工数量
Posted
技术标签:
【中文标题】获取给定季度的活跃员工数量【英文标题】:Get the count of active employees in a given quarter 【发布时间】:2020-11-09 13:25:51 【问题描述】:我需要为这里提到的用例提出一个查询。
Employee_Table
-
如果员工在当前(最新)季度不再存在,则状态为非活动
更新的 (qtr) 值作为数据上传的一部分插入
首次插入行时添加创建值。
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 表的用途是什么? 【参考方案1】:为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;
表示视图包含:
身份证 | QTR -: | :----- 1 | 2020 财年第一季度 2 | 2020 财年第二季度 3 | 2020 财年第三季度 4 | 2020 财年第四季度 5 | Q1FY21
然后您可以将两个表连接在一起并汇总以获取您的计数(如果您的季度写为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
哪些输出:
QTR |碳纳米管 :----- | --: 2020 财年第一季度 | 2 2020 财年第二季度 | 2 2020 财年第三季度 | 2 Q4FY20 | 2 2021 财年第一季度 | 3
db小提琴here
或者,您可能希望使用行生成器来创建最小值和最大值之间的所有四分之一:
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小提琴here
【讨论】:
以上是关于获取给定季度的活跃员工数量的主要内容,如果未能解决你的问题,请参考以下文章
极客日报第129期:腾讯一季度狂赚478亿!员工人均月薪7.6万;“淘宝特价版”App 正式更名为“淘特”;Deno 1.10 正式发布