i would really need your help in creating a query where i can show the number of buyers who made more than 1 order in a month for the period January 2017 to December 2017.
Also, the no. of these buyers that didn’t order again within the next 12 months.
Below is sample my data.
Date | CID (customer id) | OrderNo |
---|---|---|
2017-02-03 0:23 | 924832 | 000023149 |
2017-02-05 0:11 | 924162 | 000092384 |
2017-07-01 0:53 | 914861 | 000023182 |
2017-08-09 0:42 | 924832 | 000021219 |
Output should be like this
Month | Buyers with >1 order | Buyers that didnt order for the next 12M |
---|---|---|
2017-01-01 | 122 | 92 |
2017-02-01 | 74 | 24 |
2017-03-01 | 216 | 107 |
Advertisement
Answer
This should to match your description:
x
with cte as
(
select
ca.ym
,cid
-- flag buyers who made more than 1 order in a month
,case when count(*) > 1 then 1 else 0 end as multi_buy
-- flag buyers that didn't order again within the next 12 months
,case when LEAD(ym,1,ym) -- month of next order
over (partition by CID
order by ym) < DATEADD(month, 13, ym)
then 0
else 1
end as no_buy_within_range
from orders
CROSS APPLY
( -- truncate the OrderDate to the 1st of month
SELECT convert(Date, DATEADD(month, DATEDIFF(month, 0, OrderDate), 0)) as ym
) as ca
group by
ym
,cid
)
select
ym
,sum(multi_buy)
,sum(no_buy_within_range)
from cte
group by ym
order by ym