看起来类似存库的先进先出、。

解决方案 »

  1.   


    with a0 (sno,USERID,请假结算范围,调休时长) AS
    (
    SELECT 1,'L994','140416-140515',6 UNION ALL
    SELECT 2,'L994','140416-140515',2 UNION ALL
    SELECT 3,'L995','140416-140515',1 UNION ALL
    SELECT 4,'L995','140416-140515',4 UNION ALL
    SELECT 5,'L1593','140416-140515',3
    )
    ,a1 AS
    (
    SELECT USERID,SUM(调休时长) 调休时长 FROM a0 GROUP BY USERID
    )
    ,a2 (sno,USERID,DATE,加班时长,冲抵调休时长) AS
    (
    SELECT 1,'L1593','2014/4/16 0:00',4,0 UNION ALL
    SELECT 2,'L994','2014/4/16 0:00',3.5,0 UNION ALL
    SELECT 3,'L995','2014/4/16 0:00',2,0 UNION ALL
    SELECT 4,'L995','2014/4/17 0:00',2,0 UNION ALL
    SELECT 5,'L1593','2014/4/17 0:00',4,0 UNION ALL
    SELECT 6,'L994','2014/4/17 0:00',1,0 UNION ALL
    SELECT 7,'L995','2014/4/18 0:00',2,0 UNION ALL
    SELECT 8,'L995','2014/4/19 0:00',8,0
    )
    ,a3 AS
    (
    SELECT a.*,(SELECT SUM(加班时长) FROM a2 WHERE USERID=a.USERID AND DATE<=a.DATE) LJ,ISNULL(b.调休时长,0) 调休时长
    FROM a2 a
    LEFT JOIN a1 b ON a.USERID=b.USERID
    )
    SELECT *,
    CASE 
    WHEN 调休时长>=LJ THEN 加班时长
    WHEN 调休时长<LJ AND 调休时长-(LJ-加班时长)>0 THEN CASE when 调休时长>调休时长-(LJ-加班时长) THEN 调休时长-(LJ-加班时长) ELSE 调休时长 end
    ELSE 0
    END
    FROM a3