SQL Server查询需求:计算YTD利用率(累计月度利用率百分比)
计算SQL Server中年初至今(YTD)的利用率累计百分比
嘿,这个需求其实用SQL Server的窗口函数就能很优雅地解决,不用写复杂的自连接或者子查询。我来一步步给你拆解:
核心思路
我们需要对每个月的利用率百分比做累计求和,也就是从当年1月到当前月的所有百分比加总。这里的关键是用SUM() OVER()窗口函数,它能帮我们在不分组的情况下计算累计值。
基础查询(假设表结构完整)
首先假设你的表名为UtilizationData,包含以下字段:
CalendarYear:年份(比如2024)CalendarMonth:月份(1到12的整数)MonthlyUtilizationPct:当月的利用率百分比
基础的查询语句如下:
SELECT CalendarYear, CalendarMonth, MonthlyUtilizationPct, -- 计算YTD累计:按年份分组,按月份顺序累加 SUM(MonthlyUtilizationPct) OVER ( PARTITION BY CalendarYear ORDER BY CalendarMonth ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) AS YTDUtilizationPct FROM UtilizationData ORDER BY CalendarYear, CalendarMonth;
代码解释
PARTITION BY CalendarYear:确保我们只在同一年份内做累计,不会把2023年的12月和2024年的1月混在一起。ORDER BY CalendarMonth:保证累加是按照1月到12月的顺序进行的。ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW:这部分是窗口函数的范围,意思是从当前分组的第一行(当年1月)一直累加到当前行(当前月份)。其实在SQL Server中,当你用ORDER BY在窗口函数里时,这个范围是默认的,所以可以省略,但写出来更清晰。
处理缺失月份的情况
如果你的表中可能存在某些月份没有数据(比如某个月没有记录),直接用上面的查询会漏掉这些月份,导致累计不连续。这时我们可以先生成全年的月份序列,再左连接原表来补全:
WITH YearMonths AS ( -- 生成1-12的月份,这里假设我们要处理2024年,你可以改成动态年份 SELECT 2024 AS CalendarYear, MonthNumber FROM (VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12)) AS Months(MonthNumber) ) SELECT ym.CalendarYear, ym.MonthNumber AS CalendarMonth, ISNULL(ud.MonthlyUtilizationPct, 0) AS MonthlyUtilizationPct, SUM(ISNULL(ud.MonthlyUtilizationPct, 0)) OVER ( PARTITION BY ym.CalendarYear ORDER BY ym.MonthNumber ) AS YTDUtilizationPct FROM YearMonths ym LEFT JOIN UtilizationData ud ON ym.CalendarYear = ud.CalendarYear AND ym.MonthNumber = ud.CalendarMonth ORDER BY ym.CalendarYear, ym.MonthNumber;
这样即使某个月份没有数据,它的当月利用率会被设为0,YTD累计也会包含这个0,保证序列的完整性。
示例结果
假设原表有以下数据:
| CalendarYear | CalendarMonth | MonthlyUtilizationPct |
|---|---|---|
| 2024 | 1 | 10 |
| 2024 | 2 | 15 |
| 2024 | 3 | 8 |
运行第一个查询后会得到:
| CalendarYear | CalendarMonth | MonthlyUtilizationPct | YTDUtilizationPct |
|---|---|---|---|
| 2024 | 1 | 10 | 10 |
| 2024 | 2 | 15 | 25 |
| 2024 | 3 | 8 | 33 |
完美符合你要的YTD累计效果!
内容的提问来源于stack exchange,提问作者keerthi
相关产品推荐
相关产品推荐

