SQL: Нахождение среднего роста цен на продукты по нескольким таблицам? - PullRequest
0 голосов
/ 14 января 2019

У меня проблема с SQL для вопроса, который у меня есть в моем назначении. У меня есть пример базы данных электронной коммерции в MySQL5.7, который выглядит следующим образом. Различные стили элементов имеют одинаковую цену, один элемент может иметь несколько стилей. Меня попросили найти среднегодовой рост цен на продукцию . У меня есть общее представление о том, как мне следует подойти к этому вопросу, но у меня проблемы с переводом на SQL-запросы.

База данных SQL:

SQL database

Мой подход заключается во внутреннем объединении каждой таблицы, но Items, а затем агрегировании с GROUP BY ордерами itemsstyle.item, Years (с использованием переменной и Year(placed on)).

Итак, у меня есть два подхода к ответу на вопрос. Одним из них является усреднение всех купленных товаров (конечно, по годам), чтобы найти среднюю цену всех товаров в этом году. Это IMO плохой подход из-за разницы в ценах в данных, и на него влияет то, сколько людей покупали товары в те годы. В любом случае, я подошел к этому,

SELECT Sum(total) / Sum(quantity) AS Average,
       Year(placed_on)               AS year
FROM   orders AS a
       INNER JOIN order_items AS b
               ON a.id = b.order
GROUP  BY year  

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

1 Ответ

0 голосов
/ 14 января 2019

Это был вариант использования для LAG. Но MySQL 5.7 не поддерживает ни аналитических оконных функций, ни общих табличных выражений (они входят в 8.0).

В приведенном ниже запросе используются два идентичных подзапроса для расчета среднегодовой цены каждого продукта, а затем их сравнения. Количество и цена заказанных товаров поступают из таблицы order_items, которая может быть объединена с orders для получения даты заказа.

Правила вычислений:

  • годовая средняя цена продукта определяется как среднее значение цены, взвешенной по объему, как указано в таблице order_items. Следовательно, если в течение того же года и для одного и того же продукта у вас есть продажа 10 предметов по цене за единицу 1 и еще одна продажа по количеству 5 по цене 2, средняя цена составляет 1,5

  • среднее увеличение: (avg_price_this_year - avg_price_last_year) / avg_price_last_year

См. Эта дБ скрипка .

SELECT
    x.items,
    x.year_placed_on,
    x.year_price,
    y.year_price last_year_price,
    ( x.year_price - y.year_price) / NULLIF(y.year_price, 0) increase_rate
FROM 
    ( 
        SELECT ist.items, YEAR(ord.placed_on) year_placed_on, SUM(oit.price * oit.quantity) / SUM(oit.quantity) year_price
        FROM item_style ist
            INNER JOIN order_items oit ON oit.items_styles = ist.id
            INNER JOIN orders ord ON ord.id = oit.order
        GROUP BY ist.items, YEAR(ord.placed_on)
    ) x
    LEFT JOIN ( 
        SELECT ist.items, YEAR(ord.placed_on) year_placed_on, SUM(oit.price * oit.quantity) / SUM(oit.quantity) year_price
        FROM item_style ist
            INNER JOIN order_items oit ON oit.items_styles = ist.id
            INNER JOIN orders ord ON ord.id = oit.order
        GROUP BY ist.items, YEAR(ord.placed_on)
    ) y ON y.items = x.items AND y.year_placed_on = x.year_placed_on - 1
...