@Dritmy

Как рассчитать суммы заказов в подгруппах?

Таблица Customers содержит информацию о покупателях интернет-магазина, таблица Orders - сведения о заказах, а таблица OrderItems - позиции в заказах. Данные в таблице Orders имеют древовидную структуру.
Записи, у которых поле group_name не равно null, предназначены для группировки заказов по категориям.
Такие записи не связаны с заказчиком, не имеют даты регистрации и связанных позиций в таблице OrderItems,
но могут содержать в себе заказы или другие группы. Если же поле group_name равно null, то запись является
заказом. Она обязательно связана с покупателем, имеет позиции и дату регистрации, но не может иметь
вложенных заказов. Записи связываются с родительской группой с помощью поля parent_id, которое хранит
row_id этой группы. Записи с parent_id равным null считаются корневыми. Заказ может иметь несколько позиций
с одинаковым наименованием.
таблицы: Orders, OrderItems, Customers
60fa9c3c96bf0785165709.png
60fa9c42d196e782747043.png
60fa9c47e3a5d914026051.png


1 задание:
1 задание: Написать функцию calculate_total_price_for_orders_group. Она получает row_id группы (либо заказа), и возвращает суммарную стоимость всех позиций всех заказов в этой группе (заказе), причем
суммирование должно выполняться по всему поддереву заказов, начинающемуся с данной группы.
Функция должна возвращать число.

Я написал запрос для заказов и подгрупп, которые содержат заказы, но не понимаю, как мне пройти по всем группам, которые содержат подгруппы и посчитать все их заказы. Я пытался добавить условие, которое закомментировано, но выдается ошибка "Вложенный запрос вернул больше одного значения.
SELECT SUM(OrderItems.price) AS total FROM OrderItems
     JOIN Orders ON OrderItems.order_id = Orders.row_id
     WHERE Orders.parent_id = '2' OR Orders.row_id = '2' AND Orders.group_name IS NULL
    --OR Orders.parent_id = (Select Orders.row_id FROM Orders where Orders.parent_id = '2' )

2 задание:
2 задание: Написать запрос, возвращающий наименования всех покупателей, у которых каждый заказ в 2020 году содержит как минимум одну позицию с наименованием "Кассовый аппарат".

Результатом выполнения запроса на тестовых данных будет таблица с одной строкой "Иванов".

Тут я написал запрос, но он возвращает все заказы 2020 года, в которых есть Кассовый аппарат, как мне проверить, чтобы он был именно в каждом заказе клиента от 2020 года?? ALL не помог

SELECT Customers.name FROM Customers
    INNER JOIN Orders ON Customers.row_id = Orders.customer_id
    INNER JOIN OrderItems ON Orders.row_id = OrderItems.order_id
    WHERE Orders.registered_at > '2020/01/01'  
      AND OrderItems.name = ALL ( SELECT OrderItems.name FROM OrderItems WHERE OrderItems.name = 'Кассовый аппарат')
  • Вопрос задан
  • 180 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы