报表动态MTD、YTD查询语句

经常会有报表需要动态查询MTD和YTD汇总。这里解释一下含义:
MTD(Month To Date):从月初到当前日期
YTD(Year To Date):从年初到当前日期

假设有表EmpLeaveCNT(LeaveDate,LeaveCount),代表每个日期的离职人数(如下图所示),现要求查询离职人数每天的MTD和YTD。

这其实是一个Running Total的问题,方法有非常多,传统可用标量子查询、自连接的方式,如果是SQL Server 2012及以上版本,可以用窗口函数解决:

SELECT LeaveDate
	,LeaveCount
	,CONVERT(CHAR(7), DATEADD(DAY, 1, EOMONTH(LeaveDate, - 1)), 120) AS MTD_Month
	,SUM(LeaveCount) OVER (
		    PARTITION BY DATEADD(DAY, 1, EOMONTH(LeaveDate, - 1)) 
            ORDER BY LeaveDate
		) AS MTD_LeaveCount
	,YEAR(DATEADD(YEAR, DATEDIFF(YEAR, 0, LeaveDate), 0)) AS YTD_Year
	,SUM(LeaveCount) OVER (
		    PARTITION BY DATEADD(YEAR, DATEDIFF(YEAR, 0, LeaveDate), 0) 
            ORDER BY LeaveDate
		) AS YTD_LeaveCount
FROM EmpLeaveCNT

结果如下: