2016-11-18 1 views
0

Je travaille avec la base de données Northwind et mon exercice est:Utilisez Count() avec l'auto se joindre à SQL Server

Quels sont les fournisseurs offrent deux produits dans la même catégorie? Afficher le nom de l'entreprise, catégorie et tous les deux noms de produits

Mon code:

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` 

Comment puis-je filtrer avec COUNT() que j'ai essayé de le faire avec HAVING mais j'échoué. J'apprécierai de l'aide, ce qui me ramène sur la bonne voie.

+0

Veuillez fournir des données d'échantillon et le résultat attendu – Viki888

+1

Quelle est votre format de sortie souhaité? Votre requête actuelle ne retournera pas un résultat raisonnable pour les fournisseurs avec 3 produits. Les produits doivent-ils être dans des colonnes séparées ou pouvez-vous simplement avoir deux rangées par fournisseur? – iamdave

+0

Il devrait être une ligne avec le nom du fournisseur, les produits qui ont la même catégorie id et la catégorie id –

Répondre

0

En s'appuyant sur la réponse de Gordon, le code ci-dessous vous donnera toutes les données dont vous avez besoin. Si vous devez absolument avoir les deux produits dans la même ligne, vous pouvez utiliser 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

j'ai essayé de le faire avec PIVOT ( p.ProductName POUR EN SupplierID ([250], [251]) AS pvt ) je copie assez collé à partir du https://technet.microsoft.com/de-de/library/ms177410(v=sql.105).aspx mais il semble avoir une erreur de syntaxe –

0

Vous pouvez obtenir la liste des fournisseurs/catégories avec exactement deux produits en utilisant une requête comme ceci:

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

Ensuite, écrire une requête pour afficher les noms des fournisseurs et des produits, et utiliser ci-dessus pour filtrer les résultats de cette requête. Vous pouvez utiliser exists ou un join supplémentaire.