急急急!!!SQL查询在/离职情况

mc920879227 2012-08-18 10:11:10
知道入职日期JoinDate,离职日期LeaveDate,以及在/离职情况Ewstatus,查询某一个月的员工在职情况

要考虑到,比如某一员工201103入职的,201108离职了,表里的在/离职情况就显示已离职了,那么查询201106在职情况时,这个人就得算进去了...不能只按在/离职情况表来计算某个月的在离职人数,求高人指教!!!
...全文
231 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
人生无悔 2012-08-18
  • 打赏
  • 举报
回复

--试下
select
年月列,
sum(case when '201106' between convert(varchar(6),JoinDate,112) and convert(varchar(6),isnull(LeaveDate,'999912'),112) then 1 else 0 end) 在职人数,
count(1)-sum(case when '201106' between convert(varchar(6),JoinDate,112) and convert(varchar(6),isnull(LeaveDate,'999912'),112) then 1 else 0 end) 离职人数
from 你的表
where 年月列='201106'
group by 年月列
mc920879227 2012-08-18
  • 打赏
  • 举报
回复
不行啊,在职人数为0
人生无悔 2012-08-18
  • 打赏
  • 举报
回复

select
年月列,
sum(case when '201106' between JoinDate and isnull(LeaveDate,'999912') then 1 else 0 end) 在职人数,
count(1)-sum(case when '201106' between JoinDate and isnull(LeaveDate,'999912') then 1 else 0 end) 离职人数
from 你的表
where 年月列='201106'
group by 年月列
發糞塗牆 2012-08-18
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]

select *,
case when LeaveDate>='2011-08' then '在职' else '离职' end as '状态'
where JoinDate<'2011-08'

你的统计里面有个地方绕弯的,就是你需要统计的是那个时间前进来的所有人中,在职的和离职的情况。
[/Quote]少了表名,另外你这个只是把状态弄出来,不适合统计时间段内的数据
zhazhuzhao 2012-08-18
  • 打赏
  • 举报
回复
select *,
case when LeaveDate>='2011-08' then '在职' else '离职' end as '状态'
where JoinDate<'2011-08'

你的统计里面有个地方绕弯的,就是你需要统计的是那个时间前进来的所有人中,在职的和离职的情况。
發糞塗牆 2012-08-18
  • 打赏
  • 举报
回复
不能用count,先sum起来再除以当月的总人数。我的回复次数可能没了,如果不行你就发私信吧。你先别考虑一步到位,把你的思路分成几步,每步实现一定的结果,大不了到时何在一起做一个子查询就可以拉。
mc920879227 2012-08-18
  • 打赏
  • 举报
回复
declare @leavedate datetime;
set @leavedate='2011-06-01'
select b.CustomerName,a.Ewstatus,count(*)as sum
from tb_masEmployeeEmployer a inner join tb_masCustomer b on a.CustomerID=b.CustomerID
where @leavedate between JoinDate and LeaveDate and Ewstatus in ('N','A')
group by CustomerName,EwStatus


你看这样对吗?为什么感觉得到的值还是不对呢

豪雅光电科技(苏州)有限公司 A 48
柯尼卡美能达商用科技(无锡)有限公司 A 1
金龙联合汽车工业(苏州)有限公司 A 13
达运精密工业(苏州)有限公司 A 6
宝山区淞南卫生院 A 1
楼氏电子(苏州)有限公司 A 4
發糞塗牆 2012-08-18
  • 打赏
  • 举报
回复
declare @leavedate datetime='2011-06-01'--查询时间
select name ,Ewstatus
from test
where @leavedate between sdate and edate and Ewstatus=0
你要这样一起执行,我只是方便而已,给你看看结果,不要照搬
mc920879227 2012-08-18
  • 打赏
  • 举报
回复
不能向局部变量赋予默认值
必须声明标量变量 "@leavedate"
mc920879227 2012-08-18
  • 打赏
  • 举报
回复
不能向局部变量赋予默认值
必须声明标量变量 "@leavedate"
發糞塗牆 2012-08-18
  • 打赏
  • 举报
回复
use tempdb
go

create table test
(name char(10),
sdate datetime,
edate datetime,
Ewstatus int --0:在职;1:离职
)

insert into test values('a','2011-03-01','2011-08-31',0)
insert into test values('a','2011-09-01','2999-12-31',1)
insert into test values('b','2011-03-01','2099-12-31',0)

declare @leavedate datetime='2011-06-01'--查询时间
select name ,Ewstatus
from test
where @leavedate between sdate and edate and Ewstatus=0

上面只是一个示例,其实没有按照你的要求完全实现,不过你要是看懂了的话你的问题不难。根据我的数据,在6月1号查,a、b都在职,所以可以出来,但如果@leavedate过了8月31号,虽然第一个where可以查出来,但是ewstatus已经变为1,所以他是不会出来的,然后你只需对结果集进行统计即可。
mc920879227 2012-08-18
  • 打赏
  • 举报
回复
可以写一个示例吗???SQL语句
發糞塗牆 2012-08-18
  • 打赏
  • 举报
回复
我觉得没必要写那么多,以前我在银行做项目,做过类似的,其实你只需要把日期换个方式来存,即对于一个员工,其在职时间段,如201103-201108 ,状态为0(假设0为在职),然后再记录一条201109-299912,状态为1,问题就解决了,这是我工作经验,楼主可以参考一下。

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧