@pomagiti234

Как составить запрос?

схема БД
613468ac73542643623699.jpeg
в таблице Orders данные хранятся в иерархическом порядке, parent_id содержит row_id предка. Всего в иерархии три уровня.
Нужно составить запрос, возвращающий наименования всех покупателей, у которых каждый заказ в 2020 году содержит
как минимум одну позицию с наименованием "Кассовый аппарат".
select distinct Orders.row_id, OrderItems.name, Customers.name, Orders.registered_at 
  from orders, orderitems, Customers
  where OrderItems.name=N'Кассовый аппарат' 
    and OrderItems.order_id=Orders.row_id 
    and Customers.row_id=Orders.customer_id 
    and Orders.registered_at between '01/01/2020' and '31/12/2020'

Он выводит всех покупателей у кого есть хотя бы один заказ с заданным товаром, а надо чтоб выводил тех у кого каждый заказ его содержит.
  • Вопрос задан
  • 237 просмотров
Решения вопроса 1
rozhnev
@rozhnev
Fullstack programmer, DBA, медленно, дорого
Попробуйте следующий запрос:
select 
	customer_id, 
	Customers.name,
	count(distinct order_id) all_orders,
	count(distinct case when OrderItems.name = N'Кассовый аппарат' then order_id end) cash_machine_orders 
from Orders
join OrderItems on Orders.row_id = OrderItems.order_id
join Customers on Customers.row_id = customer_id
where Orders.registered_at between '2020/01/01' and '2020/12/31'
group by Customers.name, customer_id
having count(distinct order_id) = count(distinct case when OrderItems.name = N'Кассовый аппарат' then order_id end)
;


Test T-SQL online
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы