求当当年每月在职人数

我有一个表AA, 有入职时间,有离职时间,我要如何求出每个月的在职人数呢?

image.png

SQL lucylu 发布于 2023-5-18 15:49
1min目标场景问卷 立即参与
回答问题
悬赏:0 F币 + 添加悬赏
提示:增加悬赏、完善问题、追问等操作,可使您的问题被置顶,并向所有关注者发送通知
共4回答
最佳回答
0
Z4u3z1Lv6专家互助
发布于2023-5-18 16:06

查询 入职时间在当月最后一天之前 且 离职时间在当月最后一天最后离职的

  • lucylu lucylu(提问者) 大神能帮我写一下下吗? 多谢了呀 ORACEL SQL
    2023-05-18 16:42 
  • Z4u3z1 Z4u3z1 回复 lucylu(提问者) oracle不熟~~
    2023-05-18 16:45 
最佳回答
0
就TM你叫夏洛啊Lv6中级互助
发布于2023-5-18 15:54

没关系吧,比如这个月公司来了3个人,走了3个人,也求不出在职人数啊。肯定有其他字段啊,比如总人数字段

  • lucylu lucylu(提问者) 我按照入职时间,不是就是可以算出当月入职人数
    2023-05-18 15:57 
最佳回答
0
JL98Lv6中级互助
发布于2023-5-18 15:58(编辑于 2023-5-18 16:01)

数据库创建一个日历表,根据日历表的日期关联员工入职日期和离职日期,根据月份计算人数就可以了

SELECT 年月,count(人员工号) FROM 日历表

LEFT JOIN 人员表 ON 日历表.日期>=入职日期 AND 日历表.日期<=离职日期

GROUP BY 年月

最佳回答
0
Rose_RubyLv6初级互助
发布于2023-5-18 16:00

SELECT TO_CHAR(months.add_months(TRUNC(SYSDATE,'MM'), LEVEL-1), 'YYYY-MM') AS month,       COUNT(*) AS employee_count FROM emp CONNECT BY LEVEL <= months_between(TRUNC(SYSDATE,'MM'),TRUNC(MIN(hire_date),'MM'))+1 AND PRIOR sys_guid() IS NOT NULL AND hire_date <= add_months(TRUNC(SYSDATE,'MM'), LEVEL-1) AND (leave_date IS NULL OR leave_date > add_months(TRUNC(SYSDATE,'MM'), LEVEL-1)) GROUP BY TO_CHAR(months.add_months(TRUNC(SYSDATE,'MM'), LEVEL-1), 'YYYY-MM') ORDER BY month;

  • lucylu lucylu(提问者) 我是ORACEL数据库
    2023-05-18 16:07 
  • lucylu lucylu(提问者) 能大概给我解释下,这个SQL的语句吗? 多谢了
    2023-05-19 08:37 
  • Rose_Ruby Rose_Ruby 回复 lucylu(提问者) 1.使用 CONNECT BY LEVEL 创建一个月份数的递增序列,从最早入职月份开始,到当前月份为止。 2.判断当前入职日期是否在当前月份之前,并判断离职日期是否在当前月份之后或者为空。即判断员工在当前月份是否在职。 3.使用 TO_CHAR 和 months.add_months 函数将日期按月份格式化。 4.按月统计在职人数,使用 COUNT 聚合函数。 5.使用 ORDER BY 对结果按月份排序。
    2023-05-19 09:41 
  • 4关注人数
  • 347浏览人数
  • 最后回答于:2023-5-18 16:06
    请选择关闭问题的原因
    确定 取消
    返回顶部