Статистика клиентских заказов SQL на основе частоты заказов - PullRequest
0 голосов
/ 30 апреля 2018

У меня проблемы с этим запросом MySQL, чтобы получить статистику клиентов, основанную на частоте заказов.

Мне дали следующие критерии:

  • Заказано за последние 12 месяцев.
  • Заказывается три раза или более.
  • Заказы с интервалом менее 2 месяцев

Первые два пункта у меня не проблема, это последний. Также необходимо учитывать следующее:

  • Клиент может быть новым и совершить первую покупку только 6 месяцев назад (например), и ему придется рассчитывать исходя из этого пункта.

Это то, что я имею до сих пор:

SELECT c.customers_id, c.customers_firstname, c.customers_email_address, 
    b.biggestOrder AS largest_single_order_in_range,
    b.orders_id AS largest_single_order_id,
    COUNT(o.orders_id) AS order_count_total,
    MAX(o.date_purchased) AS last_order_date,
    MIN(o.date_purchased) AS first_order_date
FROM orders o
LEFT JOIN orders_total ot ON ot.orders_id = o.orders_id
LEFT JOIN customers c ON c.customers_id = o.customers_id
LEFT JOIN (
    SELECT o2.customers_id, o2.orders_id,
        MAX(ot2.`value`) AS biggestOrder
    FROM orders_total ot2
    LEFT JOIN orders o2 ON o2.orders_id = ot2.orders_id
    WHERE
        ot2.class = 'ot_subtotal' AND o2.orders_status = 3
    GROUP BY
        o2.customers_id
) b ON b.customers_id = c.customers_id
WHERE
    ot.class = 'ot_subtotal' AND o.orders_status = 3 
GROUP BY
    b.customers_id
HAVING
    last_order_date >= DATE_SUB(NOW(), INTERVAL 12 MONTH) 
ORDER BY
    last_order_date DESC

- Добавлена ​​таблица CREATE's (пример данных / INSERTS, чтобы следовать):

CREATE TABLE `orders` (
  `orders_id` int(11) NOT NULL AUTO_INCREMENT,
  `customers_id` int(11) NOT NULL,
  `last_modified` datetime DEFAULT NULL,
  `date_purchased` datetime DEFAULT NULL,
  `orders_status` int(5) NOT NULL,
  PRIMARY KEY (`orders_id`),
  KEY `idx_orders_customers_id` (`customers_id`),
  KEY `idx_orders_status` (`orders_status`) USING BTREE
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

CREATE TABLE `orders_total` (
  `orders_total_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `orders_id` int(11) NOT NULL,
  `value` decimal(15,4) NOT NULL,
  `class` varchar(32) CHARACTER SET latin1 NOT NULL,
  PRIMARY KEY (`orders_total_id`),
  KEY `idx_orders_total_orders_id` (`orders_id`),
  KEY `idx_class` (`class`) USING BTREE
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

CREATE TABLE `customers` (
  `customers_id` int(11) NOT NULL AUTO_INCREMENT,
  `customers_firstname` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `customers_email_address` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`customers_id`),
  KEY `idx_customers_email_address` (`customers_email_address`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

Обновление: Это близко, но не точно (фрагмент ниже не является полным, но то, что было бы добавлено к запросу вверху).

SELECT ...., COUNT(DISTINCT MONTH(o.date_purchased)) AS month_count
....
HAVING month_count >= 6

Но это будет гарантировать только то, что по крайней мере 1 заказ был размещен за 1 месяц x 6 минимум, что может дать результаты первых 6 месяцев размещения заказа, а затем ничего за оставшиеся 6 месяцев, а также исключит клиентов, чьи первые заказ был менее 6 месяцев назад.

1 Ответ

0 голосов
/ 30 апреля 2018

К существующему запросу добавьте

join (
subquery to identify orders within 3 months of each other
) frequentOrders on frequentOrders.customerId = o.customerID

что подзапрос будет следовать этой логике

from orders FirstOrder join Orders NextOrder on FirstOrder.CustomerID = NextOrder.CustomerId

where NextOrder.Date_purchased > FirstOrder.DatePurchased
and they are within 3 months of each other
and they are both within the date range of the search

Я не работаю с MySQL, поэтому не буду притворяться, что знаю синтаксис.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...