Mysql SQL统计订购同一产品至少7次的客户
我有下列表格 –价格(prodID,from,Price) –产品(prodID,名称,数量) –采购订单(prodID,订单id,金额) –订单(订单ID、日期、地址、状态、跟踪编号、客户ID、发货ID) –发货(shipID、公司、时间、价格) –客户(custID,姓名) –地址(addrID,客户ID,地址) 我想找到购买同一商品至少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.
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个以上的订单