SQL获取月份所有日期 按月度总成本分摊计算每日成本
SQL Server 实现方案
直接基于你已有的月度统计逻辑,通过递归CTE生成对应月份的全量自然日期,即可完成月度费用按天平摊,代码如下:
WITH MonthlyAgg AS ( -- 原有月度费用聚合逻辑,无需修改,保证统计口径一致 SELECT SUM(CONVERT(DECIMAL(10,2),Cost)) AS MonthCost, YEAR(ET.TransactionDate) AS Year, MONTH(ET.TransactionDate) AS Month FROM dbo.ExpenseTransaction ET GROUP BY YEAR(ET.TransactionDate), MONTH(ET.TransactionDate) ), DateSeries AS ( -- 锚点:取每个月的1号作为日期序列起点 SELECT Year, Month, MonthCost, DATEFROMPARTS(Year, Month, 1) AS Day FROM MonthlyAgg UNION ALL -- 递归逐天累加生成日期 SELECT Year, Month, MonthCost, DATEADD(DAY, 1, Day) AS Day FROM DateSeries -- 递归终止条件:日期达到当月最后一天即停止 WHERE Day < EOMONTH(DATEFROMPARTS(Year, Month, 1)) ) -- 计算日均费用并输出要求字段 SELECT MonthCost, Year, Month, Day, CONVERT(DECIMAL(10,2), MonthCost * 1.0 / DAY(EOMONTH(Day))) AS DayCost FROM DateSeries ORDER BY Year, Month, Day
关键逻辑说明
- 日期生成不需要依赖额外的日历维表,直接基于聚合得到的年月值递归生成,自动覆盖对应月份的所有自然日
- 当月总天数通过
DAY(EOMONTH(Day))计算,自动适配不同月份的天数差异,包括闰年2月的29天场景 - 计算日均时通过
*1.0做隐式类型转换,避免整数除法导致的精度丢失,最终结果保留2位小数,和示例输出格式对齐 - 递归默认最大深度为100,远大于单月最多31天的长度,不需要额外调整递归层数参数
内容的提问来源于stack exchange,提问作者Manjay_TBAG
相关产品推荐
相关产品推荐

