27,580
社区成员
发帖
与我相关
我的任务
分享
DECLARE @InputTime DATETIME
SET @InputTime='2014-03-15'
;WITH CTE AS(
SELECT ROW_NUMBER()OVER(PARTITION BY id ORDER BY effdate)RN,* FROM a
)
SELECT T1.id,T1.effdate,T1.STATUS FROM CTE T1
LEFT JOIN CTE T2 ON T1.id=T2.id AND T1.RN+1=T2.RN
WHERE T1.effdate<=@InputTime AND ISNULL(T2.effdate,GETDATE())>@InputTime
你参考下DECLARE @InputTime DATETIME
DECLARE @MonthFirst DATETIME
SET @InputTime='2014-04-15'
SET @MonthFirst = Convert(datetime,
Convert(varchar(7),@InputTime,120)+'-01',
120)
;WITH a(id,effdate,status) AS (--测试数据
SELECT 'a',Convert(datetime,'2014-01-10',120),0 UNION ALL
SELECT 'a',Convert(datetime,'2014-04-10',120),2 UNION ALL
SELECT 'a',Convert(datetime,'2014-08-10',120),1
)
,u (id) AS (--用户表
SELECT 'a'
)
,t AS (
SELECT *
FROM u
CROSS APPLY ( -- 取最新的状态
SELECT TOP 1 status
FROM a
WHERE a.id = u.id
/* 不包括当月离职的条件
AND effdate <= @InputTime
*/
/* 包括当月离职的条件 */
AND ( (status <> 2 AND effdate <= @InputTime) -- 非离职的统计到查询日期
OR(status = 2 AND effdate <= @MonthFirst) -- 离职的仅统计到上月底
)
ORDER BY effdate DESC
) s
)
SELECT Count(*) 人数
FROM t
WHERE status <> 2
--不包括当月离职:
SELECT * FROM(
SELECT ROW_NUMBER()OVER(PARTITION BY id ORDER BY effdate DESC)RN,* FROM a
WHERE effdate<='2014-03-15'
)T
WHERE RN=1 AND STATUS<>2
--包括当月离职:
SELECT * FROM(
SELECT ROW_NUMBER()OVER(PARTITION BY id ORDER BY effdate DESC)RN,* FROM a
WHERE effdate<='2014-03-15'
)T
WHERE RN=1 AND STATUS=2