gpt4 book ai didi

MySQL:如何按年按月获取活跃成员

转载 作者:行者123 更新时间:2023-11-29 02:12:45 24 4
gpt4 key购买 nike

得到上一年的在职人员,减去上一年的下岗人员,再得到上个月的下岗名单,再从结果集中减去。然后添加当月新加入的成员。

SQL Fiddle Link我感觉到我们可以对当前查询做很多改进。但是现在我没主意了,有人可以帮忙吗?

最佳答案

如果我已经正确解释了您现有的查询,我建议如下:

select
mnth.num, count(*)
from (
select 1 AS num union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all
select 7 union all select 8 union all select 9 union all select 10 union all select 11 union all select 12
) mnth
left join (
select
e.emp_id
, case
when e.hired_date < date_format(current_date(), '%Y-01-01') then 1
else month(e.hired_date)
end AS start_month
, case
when es.relieving_date < date_format(current_date(), '%Y-01-01') then 0
when es.relieving_date >= date_format(current_date(), '%Y-01-01') then month(es.relieving_date)
else month(current_date())
end AS end_month
from employee e
left join employee_separation es on e.emp_id = es.emp_id
) emp on mnth.num between emp.start_month and emp.end_month
where mnth.num <= month(current_date())
group by
mnth.num
;

这产生了以下结果(2017 年 11 月 21 日的 current_date()

| num | count(*) |
|-----|----------|
| 1 | 6 |
| 2 | 7 |
| 3 | 8 |
| 4 | 9 |
| 5 | 10 |
| 6 | 9 |
| 7 | 10 |
| 8 | 11 |
| 9 | 12 |
| 10 | 13 |
| 11 | 14 |

DEMO

根据数据量,在 emp 子查询中添加 where 子句可能会有所帮助,这也会影响 case 表达式:

          , case 
when es.relieving_date >= date_format(current_date(), '%Y-01-01') then month(es.relieving_date)
else month(current_date())
end AS end_month
from employee e
left join employee_separation es on e.emp_id = es.emp_id
where es.relieving_date >= date_format(current_date(), '%Y-01-01')

关于MySQL:如何按年按月获取活跃成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47385027/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com