Как я могу использовать COUNT и GROUP BY в MYSQL, по-прежнему отображая все отдельные строки? - PullRequest
0 голосов
/ 08 октября 2019

Я просто пробую некоторые упражнения с MYSQL. У меня есть набор данных, в котором я хотел бы получить имена клиентов, которые заказали два или более различных вида товаров, и сколько предметов каждого вида они купили.

В приведенном ниже запросе приводится строка для каждого имени. покупателя. Тем не менее, я также хочу показать, какие типы предметов они купили и сколько их. В идеале мне бы хотелось, чтобы для каждого покупателя было одинаковое количество строк, сколько разных предметов они купили.

SELECT firstname, familyname, description, quantity
FROM customers c
JOIN orders o ON o.custID = c.custID
JOIN lineitems l on o.orderID = l.orderID
JOIN items i on l.itemID = i.itemID
GROUP BY firstname
HAVING count(description) 

Приведенный ниже запрос дает мне строку для каждого предмета, количество предметов, которое этот человек купил, и имя покупателя. Тем не менее, он не фильтрует клиентов, которые уже купили только один конкретный товар.

SELECT firstname, familyname, description, quantity
FROM customers c
JOIN orders o ON o.custID = c.custID
JOIN lineitems l on o.orderID = l.orderID
JOIN items i on l.itemID = i.itemID
WHERE EXISTS(
    SELECT *
    FROM customers
    GROUP BY firstname
    HAVING count(description) >= 2)

По сути, я хотел бы объединить оба подхода, когда для каждого покупателя имеется несколько строк, а также отфильтровать клиентов. который купил только один тип предмета.

1 Ответ

0 голосов
/ 08 октября 2019

Если вы работаете с MySQL 8.0, вы можете выполнить подсчет окон в подзапросе и отфильтровать во внешнем запросе, например:

SELECT *
FROM (
    SELECT 
        c.firstname, 
        c.familyname, 
        i.description, 
        l.quantity, 
        COUNT(*) OVER(PARTITION BY c.custID) cnt
    FROM customers c
    JOIN orders o ON o.custID = c.custID
    JOIN lineitems l on o.orderID = l.orderID
    JOIN items i on l.itemID = i.itemID
) x
WHERE cnt > 1

Примечание. Рекомендуется ставить имена столбцов с префиксомпсевдоним таблицы, к которой они принадлежат;это делает запрос более читабельным и позволяет избежать конфликтов, если в таблицах существует одинаковое имя столбца. Я сделал несколько предположений и соответственно обновил запрос.

...