SQL Server 2008 中实现当月实际回款与当年累计回款

学习笔记作者:admin日期:2025-06-06点击:9

摘要:针对 SQL Server 2008,通过使用 UNPIVOT 技术优化多字段处理,实现当月实际回款与当年累计回款的统计。

SQL Server 2008 实现当月实际回款与当年累计回款

背景

      在 SQL Server 2008 中,无法使用高版本的函数(如 EOMONTH)。因此,通过 '年*12+月' 方法实现月份判断,并利用 UNPIVOT 技术简化多字段处理。

实现方式

1. 当月实际回款


SELECT 
    ID,
    SUM(CASE WHEN YEAR(收款日期) * 12 + MONTH(收款日期) = YEAR(GETDATE()) * 12 + MONTH(GETDATE())
             THEN ISNULL(收款金额, 0) ELSE 0 END) AS 当月实际回款
FROM
(
    SELECT 
        ID,
        收款序号,
        收款日期,
        收款金额
    FROM 
    (
        SELECT 
            ID,
            收款1_日期, 收款1_金额,
            收款2_日期, 收款2_金额,
            收款3_日期, 收款3_金额,
            收款4_日期, 收款4_金额,
            收款5_日期, 收款5_金额,
            收款6_日期, 收款6_金额,
            收款7_日期, 收款7_金额,
            收款8_日期, 收款8_金额,
            收款9_日期, 收款9_金额,
            收款10_日期, 收款10_金额
        FROM 回款表
    ) AS SourceTable

    UNPIVOT
    (
        收款日期 FOR 收款序号_日期 IN 
        (
            收款1_日期, 收款2_日期, 收款3_日期, 收款4_日期, 收款5_日期,
            收款6_日期, 收款7_日期, 收款8_日期, 收款9_日期, 收款10_日期
        )
    ) AS DateUnpivot

    UNPIVOT
    (
        收款金额 FOR 收款序号_金额 IN 
        (
            收款1_金额, 收款2_金额, 收款3_金额, 收款4_金额, 收款5_金额,
            收款6_金额, 收款7_金额, 收款8_金额, 收款9_金额, 收款10_金额
        )
    ) AS AmountUnpivot

    WHERE LEFT(收款序号_日期, CHARINDEX('_', 收款序号_日期) - 1) = LEFT(收款序号_金额, CHARINDEX('_', 收款序号_金额) - 1)

) AS FinalUnpivot
GROUP BY ID
ORDER BY ID;

2. 当年累计回款


SUM(CASE WHEN YEAR(收款日期) = YEAR(GETDATE())
         THEN ISNULL(收款金额, 0) ELSE 0 END) AS 当年累计回款

优点

  • 兼容 SQL Server 2008
  • 通过 UNPIVOT 简化多字段处理
  • 易于扩展

关键词

      SQL Server 2008, 当月实际回款, 当年累计回款, UNPIVOT

上一篇      下一篇