Mysql SQL统计订购同一产品至少7次的客户

Mysql SQL统计订购同一产品至少7次的客户,mysql,sql,sql-server,database,relational-database,Mysql,Sql,Sql Server,Database,Relational Database,我有下列表格 –价格(prodID,from,Price) –产品(prodID,名称,数量) –采购订单(prodID,订单id,金额) –订单(订单ID、日期、地址、状态、跟踪编号、客户ID、发货ID) –发货(shipID、公司、时间、价格) –客户(custID,姓名) –地址(addrID,客户ID,地址) 我想找到购买同一商品至少7次的客户的姓名,如果他们在同一订单中购买同一商品两次,我想将其计算为一次。这是我的密码: SELECT C.name, COUNT(DISTINCT p.

我有下列表格

–价格(prodID,from,Price)

–产品(prodID,名称,数量)

–采购订单(prodID订单id,金额)

–订单(订单ID、日期、地址、状态、跟踪编号、客户ID、发货ID)

–发货(shipID、公司、时间、价格)

–客户(custID,姓名)

–地址(addrID,客户ID,地址)

我想找到购买同一商品至少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;

然而,这是返回每个客户订购的独特产品的数量,这不是我要寻找的

我们可以在这里尝试使用两个级别的聚合。第一级聚合是按客户、订单和产品进行的,如果给定客户在单个订单中多次订购同一产品,则会删除重复项。下一级聚合仅按客户和产品进行,它只保留至少有一种产品的客户,这些产品在不同订单中购买了7次或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;

据我所知,没有必要加入
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

您需要根据客户和产品进行分组-不清楚是哪张表,但这将为您提供客户和产品的计数,其中有6个以上的订单