簡體   English   中英

SQL。 找到購買相同品牌且每個品牌至少有 2 件產品的客戶

[英]SQL. Find the customers who bought same brands and at-least 2 products in each brand

我有兩張桌子:

Sales
columns:  (Sales_id, Date, Customer_id, Product_id, Purchase_amount):
Product 
columns:  (Product_id, Product_Name, Brand_id,Brand_name)

我必須編寫一個查詢來查找購買了品牌“X”和“Y”(兩者)以及每個品牌至少 2 件產品的客戶。 以下查詢是否正確? 有什么推薦的改變嗎?

SELECT S.Customer_id "Customer ID"
FROM Sales S LEFT JOIN Product P
ON S.Product_id = P.Product_id
AND P.Brand_Name IN ('X','Y')
GROUP BY S.Customer_id
HAVING COUNT(DISTINCT S.Product_id)>=2 -----at least 2 products in each brand
 AND COUNT(S.Customer_id) =2 ---------------customers who bought both brands

任何幫助將不勝感激。 提前致謝

從現有查詢開始,您可以使用以下HAVING子句:

HAVING 
    AND COUNT(DISTINCT CASE WHEN p.brand_name = 'X' then S.product_id end) >= 2
    AND COUNT(DISTINCT CASE WHEN p.brand_name = 'Y' then S.product_id end) >= 2

這可確保客戶在兩個品牌中都購買了至少兩種產品。 這隱含地保證它在兩個品牌中都下訂單,因此不需要額外的邏輯。

你也可以用MIN()MAX()來表達:

HAVING 
    AND MIN(CASE WHEN p.brand_name = 'X' THEN S.product_id END)
        <> MAX(CASE WHEN p.brand_name = 'X' then S.product_id end)
    AND MIN(CASE WHEN p.brand_name = 'Y' THEN S.product_id END)
        <> MAX(CASE WHEN p.brand_name = 'Y' then S.product_id end)

您可以使用兩個級別的聚合:

SELECT Customer_id
FROM (SELECT S.Customer_id, S.Brand_Name, COUNT(DISTINCT S.Product_Id) as num_products
      FROM Sales S LEFT JOIN
           Product P
           ON S.Product_id = P.Product_id
      WHERE P.Brand_Name IN ('X', 'Y')
      GROUP BY S.Customer_id, S.Product_Id
     ) s
GROUP BY Customer_Id
HAVING COUNT(*) = 2 AND MIN(num_products) >= 2;

使用COUNT() window function 計算每個客戶購買的不同品牌的數量和每個品牌的不同產品的數量。
然后使用HAVING子句過濾掉沒有購買過這兩個品牌的客戶和GROUP BY客戶,該子句過濾掉每個品牌至少沒有購買 2 件產品的客戶。
此外,您的聯接應該是INNER聯接而不是LEFT

select t.customer_id "Customer ID" 
from (
  select s.customer_id,
    count(distinct p.brand_id) over (partition by s.customer_id) brands_counter,
    count(distinct p.product_id) over (partition by s.customer_id, p.brand_id) products_counter
  from sales s inner join product p
  on p.product_id = s.product_id
  where p.brand_name in ('X', 'Y')
) t
where t.brands_counter = 2
group by t.customer_id
having min(t.products_counter) >= 2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM