我有一张表格,显示按月汇总的客户付款。它看起来像这样:
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
,直到第一个休息时间(没有付款的月份)。
答案 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;