如何获取根据上个月付款停止支付的客户列表?

时间:2017-03-03 17:10:22

标签: mysql

我有一个具有以下结构的表:

payments
 - id
 - created
 - amount
 - customer_id

此表包含以下值:

'2016-12-03', 100, 1,
'2016-12-10',  50, 2,
'2016-12-23', 130, 3,

'2017-01-03', 100, 1,
'2017-01-11',  25, 4,
'2017-01-12',  50, 2,
'2017-01-24',  10, 3,
'2017-01-24',  25, 4,

'2017-02-03', 100, 1,
'2017-02-03',  25, 4,

'2017-03-03', 100, 1

(我已将数据空间分隔以获得更好的视图,数月)

考虑到这些数据,我正在尝试构建一个MySQL查询,它会让我每月只付一次(也就是订阅)的客户,至少两个月,但上个月没有付款(截至今日截至2017-02-03,但MySQL中为(UTC_DATE() - INTERVAL 1 MONTH)(自3月尚未结束)。

使用上面的数据,它会返回customer_id 2和3,但我不知道如何做到这一点。

请注意,我也是在按月推行(3月至今包括在内)

如果有所帮助,全球的想法是让那些已停止支付定期每月付款的客户。

我做了SQLFiddle来帮忙。

1 个答案:

答案 0 :(得分:1)

好的,我将从一个部分答案开始......那些在前几个月至少每月付款一次的客户......

SELECT customer_id
  FROM payments 
 WHERE created < DATE_FORMAT(NOW() ,'%Y-%m-01')
 GROUP
    BY customer_id
HAVING COUNT(DISTINCT DATE_FORMAT(created,'%Y-%m')) > 1;

...通过这个核心查询,我们可以将上个月的付款外部加入,如下所示......

SELECT a.*
  FROM 
     ( SELECT customer_id
         FROM payments 
        WHERE created < DATE_FORMAT(NOW() ,'%Y-%m-01')
        GROUP
           BY customer_id
       HAVING COUNT(DISTINCT DATE_FORMAT(created,'%Y-%m')) > 1
     ) a
  LEFT
  JOIN payments b
    ON b.customer_id = a.customer_id
   AND b.created BETWEEN DATE_FORMAT(NOW(),'%Y-%m-01') - INTERVAL 1 MONTH AND DATE_FORMAT(NOW(),'%Y-%m-01')
 WHERE b.id IS NULL;

顺便说一句,复杂的日期比较是故意的。以这种方式编写它们允许MySQL在created上使用索引(如果提供了一个索引)