2017-09-03 1 views
1

J'essaie d'écrire une requête SQL qui va retourner les meilleurs éléments pour chaque entreprise et pour chaque emplacement. J'ai un exemple table MySQL (table_x) qui ressemble à ceci:MySQL Top des éléments basés sur le nombre dans plusieurs groupes

Date  | Company | Location | Item   | Price | Quantity | Total_Amount 
----------|---------|----------|--------------|-------|----------|------------- 
1/10/2000 | ABC  | 1  | Food   | 2  | 6  | 12  
1/11/2000 | ABC  | 1  | Food   | 1  | 2  | 2 
1/12/2000 | ABC  | 2  | Food   | 10 | 5  | 50  
1/13/2000 | ABC  | 2  | Electronics | 100 | 2  | 200 
1/10/2000 | ABC  | 1  | Consumables | 10 | 5  | 50  
1/15/2000 | ABC  | 2  | Electronics | 100 | 3  | 300 
1/10/2000 | DEF  | 1  | Electronics | 50 | 5  | 250  
1/16/2000 | DEF  | 1  | Electronics | 50 | 4  | 200 
1/19/2000 | DEF  | 2  | Food   | 10 | 5  | 50  
1/14/2000 | DEF  | 2  | Food   | 2  | 10  | 20 
1/11/2000 | DEF  | 2  | Food   | 5  | 8  | 40  
1/11/2000 | DEF  | 2  | Electronics | 500 | 2  | 1000 

Et par exemple ce que je veux est de retour est le premier élément de comptage par entreprise et par emplacement. Donc, quelque chose comme ça où le premier article par nombre est par entreprise et par emplacement.

Company | Location | Item  | AVG(Price) | SUM(Total_Amount) | COUNT(*) 
--------|----------|-------------|------------|-------------------|--------- 
ABC  | 1  | Food  | 4   | 14    | 2 
ABC  | 2  | Electronics | 100  | 500    | 2 
DEF  | 1  | Electronics | 50   | 450    | 2 
DEF  | 2  | Food  | 5.67  | 110    | 3 

Je sais comment faire dans l'ensemble entreprise et lieux, mais ils ont du mal à obtenir les éléments supérieurs par comptage d'être au sein de chaque groupe spécifique. Idéalement, je voudrais être en mesure d'étendre cela aux N premiers éléments si j'ai plus de types d'éléments si possible.

Il s'agit de la requête SQL que j'ai exécutée pour générer les éléments supérieurs en fonction des occurrences.

SELECT Company, Location, Item, AVG(Price), SUM(Total_Amount), COUNT(*) FROM table_x 
GROUP BY Company, Location, Item 
ORDER BY Company, Location, COUNT(*) desc 
+0

Quand est-ce que quelque chose est un article haut? Ajoutez également ce que vous avez essayé. – Jeffrey

+0

Salut Jeffrey, un article haut est celui qui s'est produit le plus fréquemment indépendamment du prix, quantité ou total. Donc, dans l'exemple ci-dessus du résultat que je cherche, la société ABC et l'emplacement principal 1 étaient la nourriture parce qu'elle s'est produite deux fois dans ce groupe alors que l'électronique et les consommables seulement une fois. J'ai édité pour ajouter la requête que j'ai courue, mais cela ne me donne que les meilleurs éléments basés sur le compte sur l'ensemble des données. Perdu sur où affiner la déclaration pour le faire dans les groupements si cela a du sens. – Quest

Répondre

1

Utilisez la fonction de regroupement non standard de MySQL:

select * from (
    SELECT Company, Location, Item, AVG(Price), SUM(Total_Amount), COUNT(*) FROM table_x 
    GROUP BY Company, Location, Item 
    ORDER BY Company, Location, COUNT(*) desc 
) 
group by 1,2 

Avec MySQL (uniquement) lorsque vous omettez les colonnes non agrégées du groupe par liste, la première rangée de chaque combinaison est retournée .

Notez que depuis la version 5.7.5, vous devez désactiver ONLY_FULL_GROUP_BY, qui est activé par défaut.


@Jeffrey a aimablement fourni un SQLFiddle.

+1

Vous me battre par 2 min ... voici un [fiddle SQL] (http://sqlfiddle.com/#!9/36ee39/25) – Jeffrey

+0

@jeff merci. Je pensais que SQLFiddle était mort pour de bon. Ça ne fonctionnait pas depuis environ un an. Bon à voir c'est de retour. – Bohemian

+0

Cela a l'air génial! Mais que se passe-t-il si je veux inclure les colonnes agrégées. Comment la requête changerait-elle? – Quest