Sql server 2008 SQL Server 2008-按时间顺序计算缴纳金额的最小和最大日期
我有一些如下所示的客户财务数据,无法确定如何显示已支付的每个常规金额的开始和结束供款日期。我正在使用SQLServer2008。我的源数据如下所示Sql server 2008 SQL Server 2008-按时间顺序计算缴纳金额的最小和最大日期,sql-server-2008,Sql Server 2008,我有一些如下所示的客户财务数据,无法确定如何显示已支付的每个常规金额的开始和结束供款日期。我正在使用SQLServer2008。我的源数据如下所示 Cust Contrib_Date Amount ---- ------------ ------ 100 2013-01-01 500.00 100 2013-02-01 500.00 100 2013-03-02 500.00 100 2013-04-01 500.00 100 2013-05-
Cust Contrib_Date Amount
---- ------------ ------
100 2013-01-01 500.00
100 2013-02-01 500.00
100 2013-03-02 500.00
100 2013-04-01 500.00
100 2013-05-05 600.00
100 2013-06-06 600.00
100 2013-07-05 600.00
100 2013-09-10 500.00
100 2013-10-10 500.00
100 2013-11-10 500.00
100 2013-12-11 500.00
200 2010-01-01 100.00
200 2010-02-02 100.00
200 2010-03-09 300.00
下面是我试图从输出中得到的
Cust Start_Date End_Date Amount
---- ---------- ---------- ------
100 2013-01-01 2013-04-01 500.00
100 2013-05-05 2013-07-05 600.00
100 2013-09-10 2013-12-11 500.00
200 2010-01-01 2010-02-02 100.00
200 2010-03-09 2010-03-09 300.00
客户每月定期向一个账户缴款。各期间的金额保持不变(Cust=100时我们有3个,即第一期支付500.00,第二期支付600.00,第三期返回500.00),但由于上述周末、公共假日等原因,供款日期可能会有几天略有不同。因此,我需要循环浏览数据,按时间顺序为每个客户的每个金额找到最小和最大供款日期,当我遇到不同的金额时,再次启动流程。将有许多客户需要这样做
我对SQL相对来说还行,但不知道如何实现这一点。有人有什么想法吗?有人能帮忙吗?我以前使用过游标,但不是经常使用。试试这个:
SELECT y.Cust,
MIN(y.Contrib_Date) AS FromDate,
MAX(y.Contrib_Date) AS ToDate,
y.Amount
FROM (
SELECT x.Cust, x.Contrib_Date, x.Amount,
ROW_NUMBER() OVER(PARTITION BY Cust ORDER BY x.Contrib_Date ASC)
-
ROW_NUMBER() OVER(PARTITION BY Cust ORDER BY x.Amount ASC) AS GroupID
FROM @Contrib x
) y
GROUP BY y.Cust, y.GroupID, y.Amount
ORDER BY y.Cust, FromDate;
输出:
Cust FromDate ToDate Amount
---- ---------- ---------- ------
100 2013-01-01 2013-04-01 500.00
100 2013-05-05 2013-07-05 600.00
100 2013-09-10 2013-12-11 500.00
200 2010-01-01 2010-02-02 100.00
200 2010-03-09 2010-03-09 300.00
这几乎奏效了。问题是Cust=200的GroupID将两个不同的金额(100.00和300.00)组合在一起,并使用金额=100.00的最早缴款日期作为金额=300.00的起始日期,但使用金额=300.00的最早缴款日期。所以,在输出中应该有两个数量(100.00和300.00),但我只得到300.00的输出。绝对精彩!!我试过了,效果很好。非常感谢你,博格丹。我现在可以睡觉了。@BogdanSahlean:+1这是一个非常好的技巧,可以正确地划分付款顺序。谢谢你把这些数据整理好。(@Fred_Scuttle:在提问时提供这种样本数据负载,而不是依赖社区为每个答案提供样本数据负载,这是非常理想的。)