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