You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 11:30:47