2016-11-18 61 views
0

我與Northwind數據庫的工作和我的運動是:使用count()自加入SQL服務器

哪個供應商提供的兩款產品同日而語?顯示公司名稱,類別和兩個產品名稱

我的代碼:

SELECT DISTINCT 
    c.CategoryID, s.CompanyName, p1.ProductName, p2.ProductName 
FROM 
    Suppliers s 
INNER JOIN 
    Products p1 ON s.SupplierID = p1.SupplierID 
INNER JOIN 
    Products p2 ON p1.CategoryID = p2.CategoryID 
       AND p1.ProductID <> p2.ProductID 
INNER JOIN 
    Categories c ON p2.CategoryID = c.CategoryID 
GROUP BY 
    c.CategoryID,s.CompanyName, p1.ProductName, p2.ProductName` 

如何過濾與COUNT()我試着用HAVING做到這一點,但我失敗了。 我會感謝一些幫助,讓我回到正確的方式。

+0

請提供樣品的數據和預期的結果 – Viki888

+1

什麼是你想要的輸出格式?您當前的查詢不會爲具有3種產品的供應商返回明智的結果。產品是否需要分列或者每個供應商只有兩排? – iamdave

+0

它應該是與供應商名稱列,具有相同類別ID和類別ID –

回答

0

建立在戈登的答案下面的代碼將獲得所有你需要的數據。如果你絕對必須有兩個產品在同一行中,你可以使用pivot

select s.CompanyName 
     ,p.ProductName 
from Suppliers s 
    -- This join filters your Suppliers table to only those with two Products in the same Category 
    inner join (select SupplierID 
         ,CategoryID 
       from Products 
       group by SupplierID 
         ,CategoryID 
       having count(1) = 2 
       ) pc 
     on(s.SupplierID = pc.SupplierID) 

    -- This join returns the two products in the Category returned in the join above. 
    inner join Products p 
     on(s.SupplierID = p.SupplierID 
      and pc.CategoryID = p.CategoryID 
      ) 
+0

我試着用 PIVOT ( p.ProductName 這樣做對供應商ID在這兩個產品([250],[251] )作爲pvt ) 我幾乎複製粘貼它從https://technet.microsoft.com/de-de/library/ms177410(v=sql.105).aspx但它似乎有一個語法錯誤 –

0

可以使用這樣的查詢中獲取的供應商/類別列表正好用兩個產品:

select supplierId, categoryId 
from products 
group by supplierId, categoryId 
having count(*) = 2; 

然後,編寫一個查詢,顯示供應商和產品名稱,並使用上述過濾該查詢的結果。您可以使用exists或其他join