[英]How to select customers that have ordered 3 diferrent product, but not a fourth?
[英]SQL counting customers that have ordered the same product at least 7 times
我有以下表格
– 價格( 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;
但是,這是返回每個客戶訂購的獨特產品的數量,這不是我想要的。
我們可以在這里嘗試使用兩個級別的聚合。 第一級聚合是按客戶、訂單和產品,如果給定客戶在一個訂單中多次訂購相同產品,則會刪除重復項。 下一個聚合級別僅按客戶和產品進行,它僅保留至少擁有一種產品且在不同訂單中購買了 7 次或更多次的客戶。 最后,我們做了一個獨特的 select 來保留每個唯一匹配的客戶名稱。
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.