Partage
  • Partager sur Facebook
  • Partager sur Twitter

Top 5 mois par mois

Ou comment faire un multi top sur une même table

    2 décembre 2011 à 14:30:51

    Bonjour,

    Ce problème m'a beaucoup trituré l'esprit ... et finalement j'ai mis un paliatif asse bidon. Cependant, il m'arrive d'y repenser de temps en temps, comme un puzzle irrésolu.

    Sur un schéma de base de donnée, simplifié à une seule table : vente_mensuelle_par_vendeur.

    Chaque mois, on dispose de la liste de vendeur ainsi que la quantité d'objet vendu.
    "juillet 2011", "chose","5"
    "septembre 2011", "truc","12"
    "novembre 2011", "toto","5"
    "novembre 2011", "titi","8"
    "novembre 2011", "tata","3"
    "décembre 2011", "toto","7"
    "décembre 2011", "titi","1"
    "décembre 2011", "tata","12"

    Il peut y avoir entre 0 et n vendeurs par mois. Les vendeurs peuvent totalement varier d'un mois sur l'autre.

    Question : Comment, en une requête (et une seule) obtenir la liste des 2 vendeurs ayant le plus vendu pour le mois donnée ?
    Le resultat idéal serait de la forme :
    "juillet 2011", "chose","5"
    "septembre 2011", "truc","12"
    "novembre 2011", "titi","8"
    "novembre 2011", "toto","5"
    "décembre 2011", "tata","12"
    "décembre 2011", "toto","7"


    Warning : Dans cet exemple, j'affiche des date lisibles pour faciliter la compréhension. De même les noms pourraient être remplacés par des ID sur une table correctement indexé ... mais ça allourdirait l'exemple.

    Kéké
    • Partager sur Facebook
    • Partager sur Twitter
      2 décembre 2011 à 15:00:51

      Bonjour,

      Essaie ça :
      select dateVente, nomVendeur, nombreVentes 
      from Ventes v1 where 
      (select count(nombreVentes) 
      from  Ventes v2
      where v1.nombreVentes<=v2.nombreVentes
      and v1.dateVente=v2.dateVente)<=2
      


      Modèle logique : Ventes(dateVente, nomVendeur, nombreVentes)
      Voici avec quoi j'ai testé :
      CREATE TABLE IF NOT EXISTS `Ventes` (
        `dateVente` date NOT NULL,
        `nomVendeur` varchar(50) NOT NULL,
        `nombreVentes` int(11) NOT NULL
      ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
      
      --
      -- Dumping data for table `Ventes`
      --
      
      INSERT INTO `Ventes` (`dateVente`, `nomVendeur`, `nombreVentes`) VALUES
      ('2011-07-01', 'chose', 5),
      ('2011-09-01', 'truc', 12),
      ('2011-11-01', 'toto', 5),
      ('2011-11-01', 'titi', 8),
      ('2011-11-01', 'tata', 3),
      ('2011-11-01', 'chose', 2),
      ('2011-12-01', 'toto', 7),
      ('2011-12-01', 'titi', 1),
      ('2011-12-01', 'tata', 12);
      


      Romain
      • Partager sur Facebook
      • Partager sur Twitter
        2 décembre 2011 à 19:56:14

        Le fameux top n par catégorie.

        La requête avec le count est très lente si il y a beaucoup de données, donc :

        SELECT *, rank() OVER (PARTITION BY mois ORDER BY qte DESC) FROM ventes
        


        Il n'y a plus qu'à filtrer avec un WHERE...
        • Partager sur Facebook
        • Partager sur Twitter

        Top 5 mois par mois

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown