SQL подсчитывает клиентов, которые заказывали один и тот же продукт как минимум 7 раз - PullRequest
0 голосов
/ 11 ноября 2019

У меня есть следующие таблицы

- Цена ( prodID , от, цена)

- Продукт ( prodID , наименование, количество)

- PO ( prodID , orderID , сумма)

- Заказ ( orderID , дата, адрес, статус,trackingNumber, custID, shipID)

- Доставка ( shipID , компания, время, цена)

- Клиент ( custID , имя)

- Адрес ( addrID , custID, адрес)

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

SELECT C.name, COUNT(DISTINCT p.prodId) as prod_count
FROM Product P
INNER JOIN PO
ON PO.prodId = P.prodId
INNER JOIN "Order" O
ON O.orderId = PO.orderId
INNER JOIN Customer C
ON C.custId = O.custId
GROUP BY c.name
HAVING COUNT(DISTINCT p.prodId) > 6;

Однако это возвращает количество уникальных продуктов, заказанных каждым клиентом, а это не то, что я ищу.

Ответы [ 2 ]

1 голос
/ 11 ноября 2019

Мы можем попробовать использовать два уровня агрегации здесь. Первый уровень агрегации определяется по клиенту, заказу и продукту и удаляет дубликаты, если данный клиент заказывает один и тот же продукт более одного раза в рамках одного заказа. Следующий уровень агрегации - только по клиенту и продукту, и в нем остаются только клиенты, у которых есть хотя бы один продукт, который они купили 7 или более раз в разных заказах. Наконец, мы делаем отдельный выбор, чтобы сохранить каждое уникальное имя клиента.

WITH cte1 AS (
    SELECT c.name, o.orderId, p.prodId
    FROM Customer c
    INNER JOIN "Order" o ON o.custId = c.custId
    INNER JOIN PO po ON po.orderId = o.orderId
    INNER JOIN Product p ON p.prodId = po.prodId
    GROUP BY c.name, o.orderId, p.prodId
),
cte2 AS (
    SELECT name, prodId
    FROM cte1
    GROUP BY name, prodId
    HAVING COUNT(*) >= 7
)

SELECT DISTINCT name
FROM cte2;
0 голосов
/ 11 ноября 2019

Насколько я вижу, нет необходимости объединяться с таблицей Product, если вам не нужно Product имя в вашем результате.

;with CTE as(
    SELECT orderId,prodId, COUNT(*) as OrderProd_Count
    FROM dbo.PO
    GROUP BY orderId,prodId
    )
    ,CTE1 as(
    SELECT prodId,count(*) as Prod_Count
    from CTE
    group by prodId
    having count(*)>7
    )
    select c1.productid,ca.Name from CTE1 C1
    inner join CTE C on c1.prodId=c1.prodId
    inner join dbo.Order O on c.orderid=O.orderId
    inner join Customer  C on o.custid=C.custid
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...