以最小值计算和汇总连续记录

时间:2015-09-25 08:07:18

标签: sql sql-server sql-server-2014-express

我有一张表格,显示按月汇总的客户付款。它看起来像这样:

Client | Month1 | Month2 | Month3 | Month4 | Month5 | Month6  
------------------------------------------------------------
x1     | 100    | 200    | NULL   | 100    | 100    | 100  
x2     | 100    | 200    | NULL   | NULL   | 100    | 100  
x3     | NULL   | NULL   | 200    | 100    | 100    | 100  
x4     | NULL   | 200    | 300    | 100    | 100    | NULL  
x5     | 100    | 200    | 200    | 100    | 100    | 100  
x6     | NULL   | NULL   | NULL   | 100    | 100    | 100  
x7     | NULL   | 200    | 300    | 100    | 100    | 100  
x8     | NULL   | 200    | NULL   | 100    | 100    | NULL  

我需要总结连续付款的值,其中连续数为>=3,并且间隔是从上个月开始向后计算的。

因此,所有拥有第6,5和4个月的人都应该被总结,以及连续付款延伸到过去的人。考虑到这一点,并从上面的例子中,客户1,3,5,6和7应该在他们身上,总和应该是:

X1 - Last 3 months  
X3 - Last 4 months  
X5 - Last 6 months  
X6 - Last 3 Months  
X7 - Last 5 months

所以从最后一个到过去的所有月份,连续是>=3,直到第一个休息时间(没有付款的月份)。

3 个答案:

答案 0 :(得分:2)

也许有一些奇特的方法可以做到,但我现在还没有看到它。

我想去外部申请,因为你想要两次使用计算列。

case只要达到null就会结束。

select *
from data
cross apply (
   select cnt = case when month6 is null then 0
                     when month5 is null then 1
                     when month4 is null then 2
                     when month3 is null then 3
                     when month2 is null then 4
                     when month1 is null then 5
                end
)
where cnt>=3

答案 1 :(得分:1)

尝试以下脚本。它有点长,你可以更好地重写它。

select Client, sumpayment.Amount
from
(
    select
    Client,
    case
    when Month6 is null or Month5 is null or Month4 is null then 0
    when Month3 is null then Month6 + Month5 + Month4
    when Month2 is null then Month6 + Month5 + Month4 + Month3
    when Month1 is null then Month6 + Month5 + Month4 + Month3 + Month2
    else Month6 + Month5 + Month4 + Month3 + Month2 + Month1
    end as Amount
    from Payment
) sumpayment
where sumpayment.Amount > 0

上述脚本可以通过拥有子句来控制连续的月份计数,它更为通用。下面的脚本更具体。

$( document ).ready(function() {

        $('tr')
        .nthFilter('td:nth-child(1):contains("PHILIPS")')
        .nthFilter('td:nth-child(2):contains("H4")')
        .nthFilter('td:nth-child(3):contains("Bulb")')
        .css("background-color", "red");
});

jQuery.fn.extend({
  nthFilter: function(filter) {
    return $(this).has(filter);    
  }
});

答案 2 :(得分:1)

ツ的答案非常非常好,但apply完全没必要。只需使用子查询或CTE:

select d.*
from (select d.*,
             (case when month6 is null then 0
                   when month5 is null then 1
                   when month4 is null then 2
                   when month3 is null then 3
                   when month2 is null then 4
                   when month1 is null then 5
              end) as cnt
      from data d
     ) d
where cnt >= 3;