MySQL - 三个月中每一个月至少购买一次的客户

时间:2014-04-27 08:04:29

标签: mysql date subquery

我试图选择所有在由名为PrevMonth的函数定义的三个月中的每一个中至少购买一次的客户,该函数接受2个参数并返回字符串' YYYY-MM' 。第一个参数是日期,第二个参数是从第一个参数中的日期中减去的月数。

delimiter #
drop function if exists PrevMonth#
CREATE FUNCTION PrevMonth (
  in_date DATE
, in_mn_adjust INT)
RETURNS varchar(20)

BEGIN
DECLARE adjusted_date varchar(20);

set in_date := coalesce(in_date, current_date());
set adjusted_date := in_date;
set adjusted_date := date_format(date_sub(adjusted_date, interval in_mn_adjust month), '%Y-%m');

RETURN adjusted_date;
END;
#

我的查询是选择每个月至少进行一次购买的客户(我手动计算并且只有一位客户)

select DISTINCT oh.cust_id
      , concat(cust_name_last,', ',cust_name_first) as 'customer name'
      , order_date
from a_bkorders.order_headers oh
join a_bkorders.customers cu on oh.cust_id = cu.cust_id
where Date_format(order_date, '%Y-%m') in (PrevMonth(current_date(), 4))
AND oh.cust_id IN 
    (
    SELECT cust_id
    FROM a_bkorders.order_headers   
    WHERE Date_format(order_date, '%Y-%m') in (PrevMonth(current_date(), 3)))
AND oh.cust_id IN
    (
    SELECT cust_id
    FROM a_bkorders.order_headers oh    
    WHERE Date_format(order_date, '%Y-%m') in (PrevMonth(current_date(), 2)))   
;#

还有一些我无法弄清楚的奇怪原因,它只显示了第一个月(PrevMonth(current_date(), 4)的客户姓名及其相关信息。 ' AND和子查询不起作用。

有人知道为什么??

感谢您的帮助,

嘀嘀

2 个答案:

答案 0 :(得分:1)

好的,在遇到同样的问题后被困3天了。我已经意识到,在这种情况下,交集(或者对于MySQL的AND .. IN)将不起作用。因此,为了让每个月都购买了至少一个订单的客户,我不得不使用与EXISTS的相关联接。现在,我得到一个名字。

select DISTINCT cust_id, concat(cust_name_last,', ',cust_name_first) as 'customer name'
from a_bkorders.customers
where exists
    (select * 
    from a_bkorders.order_headers
    where order_headers.cust_id = customers.cust_id
    and date_format(order_date, '%Y-%m') in (PrevMonth( current_date(), 3)))
and exists
    (select *
    from a_bkorders.order_headers
    where order_headers.cust_id = customers.cust_id
    and date_format(order_date, '%Y-%m') in (PrevMonth( current_date(), 4)))
and exists
    (select *
    from a_bkorders.order_headers
    where order_headers.cust_id = customers.cust_id
    and date_format(order_date, '%Y-%m') in (PrevMonth( current_date(), 2)));

我得到了:

enter image description here

VOILA !!!

答案 1 :(得分:1)

  • EXISTS是您需要将查询结果与另一个匹配的时间 子查询。在SubQuery结果的地方需要检索查询#1结果 比赛。加入的种类。
    例如。选择在month1中下订单并且也说月份2的客户

  • IN用于检索特定列的值 列在一个列表中(1,2,3,4,5)。在这种特殊情况下,它会输出 所有至少拥有前一个记录的客户 几个月不一定都是。