【问题标题】:Calculate payments on a month by month bases from date opened SQL 2008从打开 SQL 2008 的日期开始按月计算付款
【发布时间】:2015-02-03 09:19:10
【问题描述】:

我目前正在尝试复制一个旧报告,该报告用于生成集合的滚动总和。然而,这不是一个标准的月份。这是基于 excel 的报告的屏幕截图。

蓝色部分基于一个简单的查询,并给出了用于启动的数据集(示例):

SELECT COUNT(AccountNo) AS Number, SUM(Balance) AS Value, DATENAME(MM,DateOpened) AS Month, DATEPART(Y,DateOpened) AS Year FROM tblAccounts
GROUP BY DATENAME(MM,DateOpened), DATEPART(Y,DateOpened)

这些表格非常基本:

AccountNo | Balance | DateOpened
12345     | 1245.55 | 01/01/2015

我正在努力让它以滚动方式计算月份,因此 2011 年 4 月的第 1 个月将是这些文件的第一个月(4 月付款),第 2 个月将是 5 月的帐户付款4 月开业(我希望这很清楚)。

所以这意味着 4 月的第 1 个月将是 4 月,而 11 月的第 1 个月将是 11 月。付款存储在表 tblPayments 中

AccountNo | DatePayment | PaymentValue
12345     | 02/02/2015  | 15.99

请问我是不是说的不够清楚

【问题讨论】:

  • 您能否提供必须从中获取数据的源表和所需的输出
  • 添加到表结构中。它们是非常基本的表格@SarathAvanavu

标签: sql-server sql-server-2008 common-table-expression


【解决方案1】:

假设您有一个名为“DatePayment”的列,您应该简单地执行以下操作:

SELECT COUNT(AccountNo) AS Number, SUM(Balance) AS Value, 
    DATENAME(MM,DateOpened) AS Month, DATEPART(Y,DateOpened) AS Year,
    DATEDIFF(MONTH, DateOpened, DatePayment) AS MonthN
FROM [...]
GROUP BY DATENAME(MM,DateOpened), DATEPART(Y,DateOpened), 
    DATEDIFF(MONTH, DateOpened, DatePayment)

DATEDIFF 仅计算开户日期和付款日期之间的月份。请注意,您可能希望将 DateOpened 更改为始终为 DATEDIFF 计算中的每月 1 日。

在查询的FROM [...] 部分中,您需要在您的付款表和保存您帐户的表之间建立连接,以便能够比较DateOpenedDatePayment。您应该在 AccountNo 列上加入他们。这看起来像这样:

FROM Accounts INNER JOIN Payments ON Accounts.AccountNo = Payments.AccountNo

完成此操作后,您需要确保对两个表中存在的列的所有引用都是完全限定的。这意味着COUNT(AccountNo)应该改为COUNT(Accounts.AccountNo)等。

【讨论】:

  • 谢谢,我很想知道这将如何让我获得所需的列范围(1-24),就像之前的报告一样。 @丹
  • 嗯,新列MonthN输出一个从0到N的数字(取决于付款和开盘之间的月数)。如果您将此值加 1 并在其前面加上“Month”,那么您就有了列标题。如果您希望 SQL Server 为您透视数据,请查看 PIVOT 关键字。但是,如果您在报告中使用我的查询建议的输出,您应该能够创建在“MonthN”列上分组的列组,而无需旋转数据。
  • 感谢您的回答,我已经开始运行了,但是我需要强制它识别同一个月是 datediff 中的第 1 个月,现在我得到第 0 个月? @丹
  • 只需在查询的SELECT 部分添加+1,如下所示:DATEDIFF(MONTH, DateOpened, DatePayment) + 1 AS MonthN
猜你喜欢
  • 1970-01-01
  • 2019-05-31
  • 2020-07-20
  • 1970-01-01
  • 1970-01-01
  • 2018-12-09
  • 1970-01-01
  • 1970-01-01
  • 2021-09-13
相关资源
最近更新 更多