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

?

→ Ссылка