获取给定季度的活跃员工数量

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

【讨论】:

以上是关于获取给定季度的活跃员工数量的主要内容,如果未能解决你的问题,请参考以下文章

获取与一个城市不同的员工订单数量

使用 SQL 查询获取在多个部门工作的员工数量

极客日报第129期:腾讯一季度狂赚478亿!员工人均月薪7.6万;“淘宝特价版”App 正式更名为“淘特”;Deno 1.10 正式发布

腾讯发布 2022 年季度财报,员工月薪 85473 元,网友看完炸了...

Spotfire 自定义表达式

腾讯刷屏!一季度狂赚478亿,员工人均月薪7.6万