SQL - совмещение ячеек в одну и ошибка в условии выборки
Необходимо написать SQL запрос, который найдет и выведет всех покупателей, возраста от 18 и до 65 лет, которые купили только 2 товара и все товары одной и той же категории.
Формат вывода: ID, Name (first_name last_name), Category, Products (Product 1, Product 2, ...)
-- SQLite
SELECT DISTINCT clients.id, (clients.first_name || ' ' || clients.last_name) AS Name, orders.category, orders.product
FROM clients, orders, client_orders
WHERE clients.age BETWEEN 65 AND 18
AND client_orders.client_id IN (
SELECT client_orders.client_id FROM client_orders
GROUP BY client_orders.client_id
HAVING count(*) = 2
)
AND orders.category IN (
SELECT orders.category FROM orders
GROUP BY orders.category
HAVING count(*) > 2
)
AND client_orders.order_id IN (
SELECT client_orders.order_id FROM client_orders
GROUP BY client_orders.order_id
HAVING client_orders.order_id = orders.id
);
Выводит лишнего покупателя, который купил 2 товара, но разных категорий, что я сделал не так? Не понимаю, как сджойнить строки product в одну ячейку, показывается только один товар.
Ответы (1 шт):
Автор решения: Akina
→ Ссылка
SELECT c.id,
c.first_name || ' ' || c.last_name AS Name,
o.category,
GROUP_CONCAT(o.product) products_list
FROM clients c
JOIN client_orders co ON co.client_id = c.id
JOIN orders o ON co.order_id = o.id
WHERE c.age BETWEEN 18 AND 65
GROUP BY 1, 2, 3
HAVING COUNT(*) = 2
AND COUNT(DISTINCT o.category) = 1
O! наконец понял, о чём речь. Ну-ка, а вот так:
SELECT c.id,
c.first_name || ' ' || c.last_name AS Name,
MAX(o.category) category,
GROUP_CONCAT(o.product) products_list
FROM clients c
JOIN client_orders co ON co.client_id = c.id
JOIN orders o ON co.order_id = o.id
WHERE c.age BETWEEN 18 AND 65
GROUP BY 1, 2
HAVING COUNT(*) = 2
AND COUNT(DISTINCT o.category) = 1
?