从SQL 2008开放日期开始按月计算付款

时间:2015-02-03 09:19:11

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

我目前正在尝试复制旧报告,该报告过去常常产生一系列收藏品。然而,这不是一个月的标准月份。以下是基于excel的报告的屏幕截图。

enter image description here

蓝色部分基于简单查询,并提供用于启动的数据集(示例):

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

请问我是否还不够清楚

1 个答案:

答案 0 :(得分:0)

假设您有一个名为" 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)等。