【问题标题】:Calculating payment breakages计算付款破损
【发布时间】:2014-03-21 12:19:13
【问题描述】:

我目前正在编写一份报告以突出显示付款中断,这是基于客户在 6 月付款但在 7 月未能付款的情况。

我目前已将其设置为执行除查询,以检查一个月并将其与下一个月进行比较。类似于下面(语法可能不正确,因为我必须编辑某些数据)。

DECLARE @StartDatePaid AS DATETIME
DECLARE @EndDatePaid AS DATETIME
DECLARE @StartDateMissed AS DATETIME
DECLARE @EndDateMissed AS DATETIME

SET @StartDatePaid = '01-Oct-2013'
SET @EndDatePaid   = '31-Oct-2013'
SET @StartDateMissed = '01-Nov-2013'
SET @EndDateMissed = '05-Dec-2013'

SELECT        d.StoreNo   
                , d.CustNo
FROM (
--Paid Range
SELECT     c.CustNo, m.StoreNo 
FROM         dbo.tblCont AS c INNER JOIN
                      dbo.tblContDep AS cd ON c.ContractNo = cd.ContractNo INNER JOIN
                      dbo.tblCust AS m ON c.CustNo = m.CustNo INNER JOIN
                      dbo.tblTrans AS mx ON m.CustNo = mx.CustNo AND cd.AgendaCode = mx.AgendaCode INNER JOIN
                      dbo.tblCalender AS cl ON mx.DateEvent  = cl.Date 
WHERE     (cd.Payment > 0) AND (m.Closed <> 'Y') AND (cd.AgendaCode <> 'OPCLIPMT')
                                 AND mx.DateEvent BETWEEN @StartDatePaid AND @EndDatePaid 
GROUP BY c.CustNo, m.StoreNo, mx.DateEvent 
EXCEPT 
--Missed Range
SELECT     c.CustNo, m.StoreNo
FROM         dbo.tblCont AS c INNER JOIN
                      dbo.tblContDep AS cd ON c.ContractNo = cd.ContractNo INNER JOIN
                      dbo.tblCust AS m ON c.CustNo = m.CustNo INNER JOIN
                      dbo.tblTrans AS mx ON m.CustNo = mx.CustNo AND cd.AgendaCode = mx.AgendaCode INNER JOIN
                      dtLookups.dbo.tblCalender AS cl ON mx.DateEvent = cl.Date 
WHERE     (cd.Payment > 0) AND (m.Closed <> 'Y') AND (cd.AgendaCode <> 'OPCLIPMT') AND (mx.DateEvent BETWEEN @StartDateMissed AND @EndDateMissed )
GROUP BY c.CustNo, m.StoreNo, mx.DateEvent
      ) AS d 
      WHERE d.StoreNo IN (72, 114, 121, 139, 185, 241, 266)
      GROUP BY 
                      d.StoreNo, d.CustNo

我将把它切换为基于日历月而不是日期范围,我的问题是我如何最好地一次生成几个月的破损。一次获得一个月的月份比较,因为我只能根据提供的数据来创建一个月的破损。

所需输出示例

Month| breakges
June | 201
July | 189
Aug  | 250

欢迎就最佳实践或改进方法提出建议。

【问题讨论】:

    标签: sql-server-2008 cursor except


    【解决方案1】:

    我承认我不明白您的问题。假设您的破损是第一次出现未付款,而不是后续付款。您可以像这样产生所需的输出:

    -- prepare your source data
    with cte1 as
    (
      select 
        user_id, 
        date, -- representing month by the first day
        missed -- bool flag if payment was missed in that month
        from ...    
    )
    -- add a sequence number to the source data ordered by date
    with cte2 as
    (
      select *,
        row_number() over(partition by user_id order by date) rn
      from cte1
    )
    -- select those records where payment was missed but the previous was ok
    ,cte3 as
    (
      select user_id, date from cte2 a
      where a.missed = 1
      and exists (
        select * from cte2 b 
        where b.missed = 0
        and b.uid = a.uid 
        and b.rn = a.rn -1
        )
    )
    select date, count(*) as breakage from cte3 group by date
    

    【讨论】:

      猜你喜欢
      • 2015-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多