【问题标题】:Pivoting to append the last 6 payments for 24 loans旋转附加 24 笔贷款的最后 6 笔付款
【发布时间】:2020-05-13 17:47:42
【问题描述】:

我正在 Microsoft sql server 中构建一个查询,我想在其中找到有效贷款以及有关它们的一些信息。我已经建立了一个公用表表达式,它给了我正确的人口。现在我需要从今天开始获得最后 6 笔付款。我有另一个公用表表达式,它给出了所有付款和收到的付款数据,但我不确定如何旋转和附加最后 6 笔付款,所以我有这样的东西:

这就是我可以得到 c1,...,c6 的公用表表达式的查询和输出的样子。

SELECT Account,Total,CONVERT(datetime,DateRec)  [Date Received]
FROM mars.dbo.vw_PaymentHistory PH 
WHERE  PH.SourceTyp not like '%fundin%' and PH.SourceTyp not like '%draw%'

这给出了这个(但更多):

这是我正在处理的整个查询:

Declare @monthEnding date = '3/31/2020',
        @monthStart date = '3/1/2020';



WITH Active_Loans as (                         
SELECT 
    la.Account, 
    la.LoanStatus, 
    la.PrinBal, 
    isnull(b.Amount, 0) [DUPB],
    la.PrinBal + isnull(b.Amount, 0) [TotalUPB],
    l.NoteOwner,
    pt.[Partition],
    l.paidoffdate,
    la.[First Name],
    la.[Last Name],
    la.PmtPI,
    la.PmtImpound,
    la.NextDueDate,
    la.MaturityDate,
    la.NoteOwner as [Note Owner]
FROM MARS_DW..vw_vw_Loans_ArchiveEOM la
LEFT JOIN MARS_DW..vw_DUPBByLoan b on b.Account = la.Account
    AND b.ArchiveDate = la.ArchiveDate
LEFT JOIN MARS..vw_Loans l on l.Account = la.Account
LEFT JOIN Portfolio_Analytics..partition_table pt on pt.Noteowner = l.NoteOwner
WHERE la.MonthEnding = @monthEnding
    AND la.isActive = 1 
    AND la.PaidOffDate is null 
    AND la.LoanStatus NOT LIKE 'BK Payment Plan' 
    AND la.LoanStatus NOT LIKE 'Prelim' 
    AND la.LoanStatus NOT like 'trailing claims'
    AND la.Account NOT IN (
                        SELECT account
                        FROM MARS..vw_Loans
                        WHERE servicexferdate <= 
                        DATEADD(dd, - 1, DATEADD(mm, DATEDIFF(mm, 0, @monthStart) + 1, 0))
                            AND PaidOffDate BETWEEN @monthStart AND DATEADD(dd, - 1, DATEADD(mm, DATEDIFF(mm, 0, @monthStart) + 1, 0))
                           )
UNION
(
SELECT l.account
    ,la.LoanStatus
    ,la.PrinBal
    ,isnull(b.Amount, 0) [DUPB]
    ,la.PrinBal + isnull(b.Amount, 0) [TotalUPB]
    ,l.NoteOwner 
    ,pt.[Partition]
    ,l.PaidOffDate
    ,la.[First Name]
    ,la.[Last Name]
    ,la.PmtPI
    ,la.PmtImpound
    ,la.NextDueDate
    ,la.MaturityDate
    ,la.NoteOwner as [Note Owner]
FROM MARS..vw_Loans l
LEFT JOIN MARS_DW..vw_vw_Loans_ArchiveEOM la on la.Account = l.Account
LEFT JOIN MARS_DW..vw_DUPBByLoan b on b.Account = la.Account
LEFT JOIN Portfolio_Analytics..partition_table pt on pt.Noteowner = l.NoteOwner
AND b.ArchiveDate = la.ArchiveDate
WHERE l.servicexferdate < @monthEnding
    AND l.PaidOffDate > @monthEnding
    AND la.MonthEnding = @monthEnding
    AND la.LoanStatus NOT like 'trailing claims'
    AND la.LoanStatus NOT like 'Inactive - REO/FC'
    AND pt.[Partition] IS NOT NULL
)
)
,

payments as
(
SELECT Account,Total,CONVERT(datetime,DateRec)  [Date Received]
FROM mars.dbo.vw_PaymentHistory PH 
WHERE  PH.SourceTyp not like '%fundin%' and PH.SourceTyp not like '%draw%'
)





SELECT 

rptpop.Account
, rptpop.[First Name]
, rptpop.[Last Name]
, '$' + CONVERT (VARCHAR (12), rptpop.PmtPI+rptpop.PmtImpound, 1) as PITI
,'$' + CONVERT (VARCHAR (12), rptpop.TotalUPB, 1) as [Total UPB]
, CONVERT(VARCHAR(10),rptpop.NextDueDate,101) as [Next Due Date]
, CONVERT(VARCHAR(10),rptpop.MaturityDate,101) as [Maturity Date]
, rptpop.[Note Owner]


FROM Active_Loans as rptpop
LEFT JOIN payments as pmt on pmt.Account = rptpop.Account

WHERE 
rptpop.Partition  = 'GAEA'
AND rptpop.LoanStatus = 'Current'
AND rptpop.[Last Name] NOT LIKE '%CRE%'
AND pmt.[Date Received] BETWEEN @monthStart AND @monthEnding

编辑:

根据下面的答案,我能够做到这一点:

payments as
(
SELECT ROW_NUMBER() OVER(Partition By Account ORDER BY CONVERT(datetime,DateRec)  DESC) AS [RowNumber], Total, Account
FROM mars.dbo.vw_PaymentHistory
)
,

get_payment1 as
(
SELECT * FROM payments
where RowNumber = 1

)

这给了我数字,但我不明白的是 1.) 这确实是正确的,2.) 假设它是正确的,它如何获得最近的日期?也许是 order by 子句?

【问题讨论】:

    标签: sql sql-server pivot


    【解决方案1】:

    我看到了几种解决问题的方法。我可以使用伪代码分享该方法。

    创建 Payments CTE ,类似于 SELECT ROW_NUMBER() OVER(Partition By Account ORDER BY ReceivedDate DESC) 。然后创建 6 个使用上述 CTE 和 Row_Number 1 到 6 的 CTE。然后只需在查询中使用那些使用 Left Join 的 CTE,加入 Account#。这将添加 c1-c6 列。

    第二种方法是使用相同的 Payments CTE,而不是多个 CTE,找到一种使用 UNPIVOT unpivot (Amount for Rows in (1,2,3,4,5,6) ) u;

    【讨论】:

    • 我会尝试第一个,谢谢。会让你知道我的进步
    • 实际上你能不能稍微扩展一下创建 6 CTE 的部分,这对我来说是一个但不清楚的地方。
    • 你能提供一个我可以参考的例子吗?抱歉,我对此完全陌生。
    • 我们可以将其扩展到聊天吗?我只是对创建其他 6 个 CTE 的部分感到困惑;s
    • 明白了,谢谢你让我自己做,现在我学到了一些东西哈哈
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-30
    • 2013-06-12
    • 2015-08-04
    相关资源
    最近更新 更多