2016-11-18 56 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