Заказывайте товары по продажам в течение 30 дней, затем следуйте без продаж

0

Я пытаюсь получить список продуктов, заказанных проданным количеством за последние 30 дней.

Как я могу сделать следующий запрос и заказать по количеству продаж за последние 30 дней, а за ними следуют продукты, которые ничего не продали за эти 30 дней?

Мне нужны те, у кого есть продажа в течение последних 30 дней, а затем без каких-либо продаж.

Поле с датой продажи - это поле datetime называемое orders.sold_time

Это мой текущий запрос:

SELECT    pd.products_id AS id, pd.products_name AS name
FROM      products_description pd
LEFT JOIN products ON pd.products_id = products.products_id
LEFT JOIN orders_products ON pd.products_id = orders_products.products_id
LEFT JOIN orders ON orders_products.orders_id = orders.orders_id
WHERE     pd.c5_dataset = 'DAT'
AND       products.products_status =1
AND       pd.language_id =4
AND       NOT EXISTS (
              SELECT 1
              FROM   products_description
              WHERE  products_id = pd.products_id
              AND    language_id = 10
          )
AND       orders_total.class = 'ot_total'
GROUP BY  pd.products_id
ORDER BY  count( orders_products.products_quantity ) DESC
  • 0
    Вы говорите, что вам нужны последние 30 дней продаж?
  • 0
    «заказ на последние 30 дней» : что это значит? Вы хотите заказать по дате самой последней продажи? Если вы хотите также просмотреть записи, которые не были проданы в течение последних 30 дней, вы говорите, что хотите всего, так почему бы просто не заказать по убыванию? Или что ты здесь говоришь?
Показать ещё 2 комментария
Теги:
date
sql-order-by

1 ответ

1
Лучший ответ

Вы можете использовать case when выражение для этого. Выражение, которое дает вам проданное количество за последние 30 дней:

sum(case when orders.sold_time >= date_add(curdate(), interval -30 day) 
         then orders_products.products_quantity 
    end)

Вы можете поместить это в оговорку по order by, а затем вы должны решить, что заказывать статьи, у которых нет продаж за последние 30 дней. Это может быть, например, все время проданного количества.

Я бы также использовал псевдонимы для всех ваших таблиц (как и для первого). Так что o для orders, op для orders_products.

Тогда ваш order by будет выглядеть так:

order by sum(case when o.sold_time >= date_add(curdate(), interval -30 day) 
                  then op.products_quantity 
             end),
         sum(op.products_quantity)

Чтобы проверить результаты, было бы неплохо добавить эти два выражения в список select.

Некоторые примечания о SQL:

Поскольку у вас есть ненулевое условие для products.products_status (= 1), нет веских оснований использовать LEFT JOIN products. Вместо этого используйте более эффективный INNER JOIN.

Вероятно, вы получите эффективность, если вы замените условие NOT EXISTS на предложение INNER JOIN:

INNER JOIN products_description p2
       ON p2.products_id = pd.products_id
      AND p2.language_id = 10

при условии, что может быть не более одного описания для каждого продукта и языка.

  • 0
    Удивительный ответ, спасибо
  • 0
    Пожалуйста ;-)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню