2016-03-30 7 views
0

私は3つのテーブルを持っています。2番目の左のフィルタにジョインする - SQL

表の顧客

CustID, Name 
    1,  Tom 
    2,  Lisa 
    3,  Fred 

表製品

CustID, Item 
    1,  Toaster 
    1,  Breadbox 
    2,  Toaster 
    3,  Toaster 

表は

を返します:一つは、一つは、彼らが購入した製品や、彼らが行っているリターンの最後の1で構成され、顧客から成り
CustID, Date, Reason 
    1,  2014, Guarantee 
    2,  2013, Guarantee 
    2,  2014, Guarantee 
    3,  2015, Guarantee 

Toasterを購入したすべてのお客様に、また、パンを買ったが、商品を2回以上返品した場合は返品しなかった。

だから私は、次のことを試してみました:

SELECT * FROM Customer 
LEFT JOIN Product ON Customer.CustID=Product.CustID 
LEFT JOIN Returns ON Customer.CustID=Returns.CustID 
WHERE Item = 'Toaster' 
AND Customer.CustID NOT IN (
Select CustID FROM Product Where Item = 'Breadbox' 
) 

私のトースターではなくbreadboxを買ってきたものを与えること。したがって、リサとフレッド。

しかし、私はLisaが意図的に製品を分解するのではないかと疑いますので、製品を2回以上返品したものは含めたくありません。したがって、Fredsの情報のみを取得するには、このステートメントに何を追加しますか?およそ

SELECT * FROM Customer 
LEFT JOIN Product ON Customer.CustID=Product.CustID 
WHERE Item = 'Toaster' 
AND Customer.CustID NOT IN ( 
    Select CustID FROM Product Where Item = 'Breadbox' 
) 
AND (SELECT COUNT(*) FROM Returns WHERE Customer.CustId = Returns.CustID) <= 1 
+0

を使用しています。ここをクリックしてください - > http://stackoverflow.com/questions/36293041/select-all-customers-except-if-they-have-another-product-sql –

+0

@SatwikNadkarny同じですが、今では返品条件を追加します –

答えて

1

:最初のテーブルの上に

SELECT * 
FROM Customer c LEFT JOIN 
    Product p 
    ON c.CustID = p.CustID AND p.Item = 'Toaster' LEFT JOIN 
    Returns r 
    ON c.CustID = r.CustID 
WHERE c.CustID NOT IN (Select p.CustID FROM Product p Where p.Item = 'Breadbox'); 

条件はWHEREに残ります

注:を含むProductという表は、次のように見えます。 kward。テーブルはより多くの好きなように動作します。名前はCustomerProductsです。

0

フィルタ条件がLEFT JOINのシリーズのすべてが、最初のテーブルのためのON句(に行く方法

+1

まだ顧客があまりにも多くの製品を破損する場合には、「返品」の条件が必要です。テーブル製品は 'Sales'のようなものです。あなたの400kのマークにBtwのコグラット。 –

0

あなたは私はあなたが昨日この質問を推測条件COUNT

SELECT C.CustID, C.Name 
FROM Customer C 
JOIN (SELECT CustID 
     FROM Products 
     GROUP BY CustID 
     HAVING COUNT(CASE WHEN Item = 'Toaster' THEN 1 END) > 1 
      AND COUNT(CASE WHEN item = 'Breadbox' THEN 1 END) = 0 
    ) P -- Get customer with at least one Toaster and not Breadbox 
    ON C.CustID = P.CustID 
JOIN (SELECT CustID 
     FROM Returns 
     HAVING COUNT(*) < 2 
    ) R -- Get only customers with less than 2 returns 
    ON C.CustID = R.CustID 
関連する問題