2010-11-02 7 views
10

Très bien, j'essaie de voir combien de produits sont fournis par chaque fournisseur (les produits et les fournisseurs étant des tables séparées). Je veux que les résultats soient affichés avec le nom de l'entreprise et le nombre de produits disponibles pour cette société. Je ne suis pas sûr exactement comment mettre cela en place.SQL - Joindre deux tables et compter les articles

Jusqu'à présent, j'ai:

SELECT CompanyName, Count(ProductName) FROM Suppliers 
left join Products on Suppliers.SupplierID = Products.SupplierID; 

Je ne sais pas comment faire spécifique compter ProductName à chaque entreprise. Je serais éternellement reconnaissant pour toute aide que vous pourriez être en mesure de me fournir.

Répondre

15

Tout ce que vous manquez est une clause GROUP BY:

SELECT CompanyName, Count(ProductName) 
    FROM Suppliers LEFT JOIN Products 
    ON Suppliers.SupplierID = Products.SupplierID 
GROUP BY CompanyName; 

L'utilisation de GAUCHE {OUTER} REJOIGNEZ signifie que s'il y a des fournisseurs qui ne fournissent pas de produits, la jointure renvoie un ensemble de Valeurs NULL pour les colonnes correspondant à la table Products. COUNT (ProductName) compte alors uniquement le nombre de valeurs non nulles, produisant ainsi la réponse 0 pour les entreprises qui ne fournissent aucun produit. Très souvent, vous utiliseriez une INNER JOIN régulière et vous ne verriez pas les entreprises qui ne fournissent aucun produit.

+0

Wow, j'ai honte de moi-même. Merci beaucoup! – tim

+0

Je sais que c'est une vieille question, mais comment utilisez-vous une clause 'WHERE' avec ceci, si vous voulez seulement montrer des enregistrements où le nombre de ProductName est inférieur à 10, par exemple? – Clay

+0

Interprété littéralement, vous devez écrire la requête d'origine en tant que sous-requête: 'SELECT CompanyName, ProductCount FROM (SELECT CompanyName, COUNT (NomProduit) AS ProductCount FROM Fournisseurs LEFT JOIN Produits ON Suppliers.SupplierID = Products.SupplierID GROUP BY CompanyName) EN TANT QUE ProductCount <10'. Cependant, la clause HAVING serait appropriée, après la clause GROUP BY, dans la requête de base: 'HAVING COUNT (ProductName) <10'. –