我有一个请假表,格式如下
请假时间 请假时间到 请假人员
2015-5-20 2015-5-25 a
2015-5-30 2015-6-1 a
2015-5-24 2015-5-25 b
2015-5-25 2015-6-5 b
2015-4-25 2015-6-5 c
我想要的结果是
a在5月请假天数为:6+2=8天
a在6月请假天数为:1天
b在5月请假天数为:2+7天
b在6月请假天数为:6天
c在4月请假天数为:6天
c在5月请假天数为:31天
c在6月请假天数为:6天
难点就是如果请假时间段不跨月很好统计,但一旦跨月了,请假记录就要撤分开来分别统计单个月的请假天数,
领导要求跨月的就要撤分来统计每月员工的请假天数,
请问怎么来写sql来得到这样的报表?
------解决思路----------------------
如果上面的重叠情况,你试下
SELECT 请假人员,MONTH(请假时间)[月份]还有你的一些天数算错了
,SUM(DATEDIFF(DAY,请假时间,请假时间到)+1)[总天数]
FROM(
SELECT 请假人员
,CASE WHEN T2.number=0 THEN T1.请假时间 ELSE DATEADD(MONTH,T2.number,T1.StartDay) END[请假时间]
,CASE WHEN DATEADD(DAY,-1,DATEADD(MONTH,T2.number+1,T1.StartDay))<T1.请假时间到
THEN DATEADD(DAY,-1,DATEADD(MONTH,T2.number+1,T1.StartDay)) ELSE T1.请假时间到 END[请假时间到]
FROM(SELECT 请假时间,请假时间到,请假人员
,DATEADD(DAY,1-DAY(请假时间),请假时间)StartDay
FROM 请假表)T1
JOIN master..spt_values T2 ON T2.number<=DATEDIFF(MONTH,T1.请假时间,T1.请假时间到)
WHERE T2.type='P'
)T
GROUP BY 请假人员,MONTH(请假时间)
ORDER BY 1,2