我试图选择所有在由名为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和子查询不起作用。
有人知道为什么??
感谢您的帮助,
嘀嘀
答案 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)));
我得到了:
VOILA !!!
答案 1 :(得分:1)
EXISTS
是您需要将查询结果与另一个匹配的时间
子查询。在SubQuery结果的地方需要检索查询#1结果
比赛。加入的种类。
例如。选择在month1中下订单并且也说月份2的客户
而IN
用于检索特定列的值
列在一个列表中(1,2,3,4,5)。在这种特殊情况下,它会输出
所有至少拥有前一个记录的客户
几个月不一定都是。