D
D
Dritmy2021-07-23 13:40:42
SQL Server
Dritmy, 2021-07-23 13:40:42

How to calculate the amount of orders in subgroups?

The Customers table contains information about online store customers, the Orders table contains information about orders, and the OrderItems table contains items in orders. The data in the Orders table has a tree structure.
Records whose group_name field is not null are intended for grouping orders by category.
Such records are not associated with a customer, do not have a registration date and associated items in the OrderItems table,
but may contain orders or other groups. If the group_name field is null, then the record is an
order. It is necessarily associated with the buyer, has positions and registration date, but cannot have
nested orders. Records are associated with a parent group using the parent_id field, which stores
row_id of this group. Records with parent_id equal to null are considered root. An order can have multiple items
with the same name.

tables: Orders, OrderItems, Customers
60fa9c3c96bf0785165709.png
60fa9c42d196e782747043.png
60fa9c47e3a5d914026051.png


1 task:
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 task:
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 = 'Кассовый аппарат')

Answer the question

In order to leave comments, you need to log in

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question