2010-08-14 5 views
4

J'ai une table où j'ai besoin d'obtenir les articles les plus élevés pour chaque catégorie.Accès top n dans le groupe

 
Category Item InventoryCount 
------- ----- ------------- 
Beverage milk 3 
Beverage water 2 
Beverage beer 9 
Utensil fork 7 
Utensil spoon 2 
Utensil knife 1 
Utensil spork 4 

Ma sortie désirée est l'inventaire le plus élevé des 2 catégories les plus élevées.

 
Category Item InventoryCount 
------- ----- ------------- 
Beverage beer 9 
Beverage milk 3 
Utensil fork 7 
Utensil spork 4 

Répondre

8

Ceci devrait fonctionner pour vous. S'il ne répond pas à vos exigences, affichez ce dont vous avez besoin. Votre désir originel était d'avoir 25, donc vous devriez modifier simplement la dernière clause soit HAVING COUNT(*) <= 25

SELECT a.item, 
     a.category, 
     a.inventorycount, 
     COUNT(*) AS ranknumber 
FROM inv AS a 
INNER JOIN inv AS b 
    ON (a.category = b.category) 
    AND (a.inventorycount <= b.inventorycount) 
GROUP BY a.category, 
      a.item, 
      a.inventorycount 
HAVING COUNT(*) <= 2 
ORDER BY a.category, COUNT(*) DESC 

Si vous voulez sélectionner plusieurs colonnes de la table, ajoutez simplement au SELECT et `GROUP BY » clauses. Lorsque vous souhaitez développer le «TOP n pour chaque catégorie, foo, bar», vous devez ajouter ces colonnes à la clause INNER JOIN.

--show the top 2 items for each category and year. 
SELECT a.item, 
     a.category, 
     a.year, 
     a.inventorycount, 
     COUNT(*) AS ranknumber 
FROM inv AS a 
INNER JOIN inv AS b 
    ON (a.category = b.category) 
    AND (a.year = b.year) 
    AND (a.inventorycount <= b.inventorycount) 
GROUP BY a.category, a.item, a.year, a.inventorycount 
HAVING COUNT(*) <= 2 
ORDER BY a.year, a.category, COUNT(*) DESC 
+0

Merci! ça a merveilleusement bien fonctionné! Je sais que je demande beaucoup mais je dis que j'ai ajouté deux autres colonnes: Lieu et année. Serait-il possible dans la même requête de regrouper les 2 catégories principales par emplacement et par année? – Rick

+0

Lorsque j'ajoute "ON (a.year = b.year)", j'obtiens une erreur de syntaxe. – Rick

+0

@Rick: c'était une erreur de copier/coller. Devrait être 'AND'. Corrigé ci-dessus. –

-3

Si l'ordre n'a pas d'importance:

SELECT * FROM inv 
ORDER BY InventoryCount DESC LIMIT 5 
+0

cette réponse ne résoudra pas le problème d'affaires. Remarque: Microsoft Access ne prend pas en charge la clause 'LIMIT'. –

+0

Ne publiez pas de réponses avec SQL qui ne fonctionne pas pour le moteur de base de données indiqué dans la question -1. –

+0

Toutes mes excuses pour l'envoi de SQL non pris en charge à une question MS Access. Mais corrigez-moi si je me trompe, mais dans Access il y a une fonctionnalité similaire: "select top 5 * from ..." – Allan