「已注销」 2022-03-27 16:40 采纳率: 100%
浏览 86
已结题

sql 语句查询计算 等问题

现有表A 部门A1 人员状态(在职,离职)A3入职日期 A4离职日期

查询某月各部门月初在职人数、月末在职人数、入职人数、离职人数、人员入职率、人员离职率,其中人员入职率=入职人数/((月初在职+月末在职)/2)、人员离职率=离职人数/((月初在职+月末在职)/2)。
现显示如下
(部门名称、月初在职、月末在职、入职人数、离职人数、入职率、离职率)

  • 写回答

1条回答 默认 最新

  • DarkAthena ORACLE应用及数据库设计方案咨询师 2022-03-27 18:10
    关注
    create table test_20220327_a (A1 VARCHAR(100),A2 VARCHAR(10),A3 datetime,A4 datetime);
    INSERT INTO test_20220327_a VALUES ('1','','2022-02-27 00:00:00','2022-03-27 00:00:00');
    INSERT INTO test_20220327_a VALUES ('1','','2022-01-27 00:00:00','2022-02-27 00:00:00');
    INSERT INTO test_20220327_a VALUES ('1','','2022-01-27 00:00:00','2022-02-27 00:00:00');
    INSERT INTO test_20220327_a VALUES ('2','','2022-01-27 00:00:00','2022-02-27 00:00:00');
    INSERT INTO test_20220327_a VALUES ('2','','2022-02-27 00:00:00','2022-03-27 00:00:00');
    INSERT INTO test_20220327_a VALUES ('2','','2022-01-21 00:00:00','2022-05-27 00:00:00');
    
    --假设查2022-02
    
    select 部门,月初在职,月末在职,入职人数,离职人数,
    round(入职人数/((月初在职+月末在职)/2)*100,2)  入职率,
    round(离职人数/((月初在职+月末在职)/2)*100,2)  离职率 
    from (
    select A1 部门,
    cast(count(case when '2022-02-01' between A3 and isnull(A4,'9999-12-31') then 1 end ) as NUMERIC) 月初在职,
    cast(count(case when '2022-02-28' between A3 and isnull(A4,'9999-12-31') then 1 end ) as NUMERIC) 月末在职,
    cast(count(case when A3 between '2022-02-01' and '2022-02-28' then 1 end) as NUMERIC) 入职人数,
    cast(count(case when isnull(A4,'9999-12-31') between '2022-02-01' and '2022-02-28' then 1 end) as NUMERIC) 离职人数
    from test_20220327_a
    GROUP BY A1) b
    

    img

    如果只使用一个变量日期,那么可以根据这个变量来计算出对应的月初和月末是哪一天,把对应的计算表达式放到上面的sql中即可

     select dateadd(day,-day('2022-02-03')+1,'2022-02-03') firstday,
           dateadd(day,
                   -day('2022-02-03'),
                   dateadd(month,1,'2022-02-03')) lastday
       from t1
    

    SQLSERVER有坑,除数为0时不会直接报错,而是输出不完整的数据,因此需要使用case when先判断一下除数是否为0

    select 部门,月初在职,月末在职,入职人数,离职人数,
    CASE WHEN 月初在职+月末在职 =0 THEN NULL ELSE round(入职人数/((月初在职+月末在职)/2)*100,2) END   入职率,
    CASE WHEN 月初在职+月末在职 =0 THEN NULL ELSE round(离职人数/((月初在职+月末在职)/2)*100,2) END   离职率 
    from (
    select deptpath 部门,
    cast(SUM(case when '2020-03-01' between a0144 and isnull(lzdate,'9999-12-31') then 1 ELSE 0 end ) as NUMERIC) 月初在职,
    cast(SUM(case when '2020-03-31' between a0144 and isnull(lzdate,'9999-12-31') then 1 ELSE 0 end ) as NUMERIC) 月末在职,
    cast(SUM(case when a0144 between '2020-03-01' and '2020-03-31' then 1 ELSE 0 end) as NUMERIC) 入职人数,
    cast(SUM(case when isnull(lzdate,'9999-12-31') between '2020-03-01' and '2020-03-31' then 1 ELSE 0 end) as NUMERIC) 离职人数
    from A01
    GROUP BY deptpath) b
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 3月28日
  • 已采纳回答 3月27日
  • 创建了问题 3月27日

悬赏问题

  • ¥15 各位请问平行检验趋势图这样要怎么调整?说标准差差异太大了
  • ¥15 delphi webbrowser组件网页下拉菜单自动选择问题
  • ¥15 wpf界面一直接收PLC给过来的信号,导致UI界面操作起来会卡顿
  • ¥15 init i2c:2 freq:100000[MAIXPY]: find ov2640[MAIXPY]: find ov sensor是main文件哪里有问题吗
  • ¥15 运动想象脑电信号数据集.vhdr
  • ¥15 三因素重复测量数据R语句编写,不存在交互作用
  • ¥15 微信会员卡等级和折扣规则
  • ¥15 微信公众平台自制会员卡可以通过收款码收款码收款进行自动积分吗
  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab