2010-10-08 5 views
1

J'ai essayé de trouver comment écrire cette requête en sql.Comment utiliser SQL pour sélectionner des lignes contenant plus de 50 lignes dans une autre table?

Ce dont j'ai besoin est de trouver les noms de produits (dans la table des produits) qui ont 50 commandes ou plus (qui sont dans la table des commandes).

Un seul orderid est associé à un nom de produit à la fois, alors quand j'essaie de compter les ID, il les compte tous.

Je peux obtenir des noms de produits distincts, mais une fois que j'ajoute dans les commandes, il revient à avoir plusieurs noms de produit.

J'ai également besoin de compter le nombre de clients (dans la table de commande) qui ont commandé ces produits.

J'ai besoin d'une aide sérieuse dès que possible! si quelqu'un pouvait m'aider à comprendre comment comprendre cela serait génial!

Table: Products 
     `productname` in the form of a text like 'GrannySmith' 

Table: Orders 
     `orderid` in the form of '10222'..etc 
     `custid` in the form of something like 'SMITH' 
+2

quelle est la colonne qui relie les produits à ses commandes? pouvez-vous poster le schéma entier? Aussi quel moteur DB utilisez-vous? – InSane

Répondre

7

En supposant que la table orders possède un champ qui renvoie à la table de produits nommée ProductId. Le SQL se traduirait par:

SELECT p.ProductName, Count(*) 
FROM Orders o 
JOIN Products p 
    on o.ProductId = p.ProductId 
GROUP BY p.ProductName HAVING COUNT(*) >= 50 

La clé est dans le composant having du groupe par la clause. J'espère que ça aide.

2

Vous pourriez manquer une table « Détails de la commande » - généralement, un ordre a plusieurs détails de la commande, et chacun des détails de la commande des cartes puis à un produit - quelque chose comme l'échantillon dans Northwind:

alt text

Dans ce cas, votre requête SQL serait quelque chose comme ceci: rejoignez la table [Order Details] à la fois les [Orders] et [Products] tables, groupe par l'ID du produit et le nom, et compter de la OrderID:

select 
    p.ProductID, p.ProductName, count(o.OrderID) 
from 
    [order details] od 
inner join 
    orders o on od.OrderID = o.OrderID 
inner join 
    products p ON od.productID = p.ProductID 
group by 
    p.ProductID, p.ProductName 
having 
    count(o.OrderID) > 50 
+0

Peut-être ajouter 'avoir count (*)> 50' pour répondre à la question initiale de l'OP? –

+0

@ Mark Bannister: oui, très probablement :-) Correction de ma réponse ... –

Questions connexes