IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

Avoir les cent meilleurs


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Homme Profil pro
    Lycéen
    Inscrit en
    Janvier 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2013
    Messages : 6
    Par défaut Avoir les cent meilleurs
    Bonjour à tous,
    voila je veux essayer de faire un classement des 100 produits qui ont le plus de votes et je ne vois pas comment récupérer les 100 produits en SQL.
    Pour l'instant je n'ai rien de concret et donc si vous avez une idée vous pouvez utiliser vos propres variables et je me débrouillerai.
    Merci d'avance.
    Bonne journée.

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Par défaut
    Bonjour,

    Pour le tri => ORDER BY
    Pour la limite .. ca dépend générallement du SGBD cherchez sur google avec les mots clefs limit / top / fetch first + le nom de votre SGBD

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 22 001
    Billets dans le blog
    6
    Par défaut
    En SQL normatif :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    WITH T AS
    (
    SELECT Produit, 
           COUNT(*) OVER(PARTITION BY Produit ORDER BY SUM(Vote) DESC) AS N
    FROM   MaTable
    GROUP  BY Produit
     
    )
    SELECT * 
    FROM   T
    WHERE  N >= 100

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Par défaut
    Bonjour,

    Il me semble que le PARTITION BY est de trop, ça va renvoyer 1 pour chaque ligne. Et c'est N <= 100.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    WITH T AS
    (
    SELECT Produit, 
           COUNT(*) OVER(ORDER BY SUM(Vote) DESC) AS N
    FROM   MaTable
    GROUP  BY Produit
    )
    SELECT * 
    FROM   T
    WHERE  N <= 100

  5. #5
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    C'est l'utilisation du COUNT avec ORDER BY qui me semble pour le moins étrange.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    WITH T AS
    (
    SELECT Produit, 
               ROW_NUMBER() OVER(ORDER BY Votes DESC) AS N
    FROM   MaTable
    )
    SELECT * 
    FROM   T
    WHERE  N <= 100
    Et s'il y a une table de jointure Vote / Produit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    WITH MaTableVotes AS
    (
    SELECT produit
              ,count(*) AS Votes
       FROM MaTable
               INNER JOIN TableVotes ON MaTable.produit = TableVotes.produit
    -- Note : je met MaTable ici pour permettre des filtres, sinon s'il y a une clé étrangère on peut directement passer par la table de jointure.
    GROUP BY produit
    ),
    T AS
    (
    SELECT Produit, 
               ROW_NUMBER() OVER(ORDER BY Votes DESC) AS N
    FROM   MaTableVotes 
    )
    SELECT * 
    FROM   T
    WHERE  N <= 100
    En pouvant changer row_number par rank ou dense_rank selon ce qu'on veut faire des cas des ex-eaquo.

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Par défaut
    C'est l'utilisation du COUNT avec ORDER BY qui me semble pour le moins étrange.
    C'est pourtant correct, mais ça correspond à un besoin différent.

    En admettant que l'on ne définisse pas de second critère de tri pour départager les ex-aequo, et que les produits de 90 à 110 aient le même nombre de votes, la requête avec count renverra les 90 premiers, rank() en renverra 110, et row_number() en renverra 100, les 10 derniers retournés arbitrairement.
    Quant à dense_rank, s'il y a souvent des ex-aequo on peut vite se retrouver avec beaucoup plus de lignes que prévu.

  7. #7
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 22 001
    Billets dans le blog
    6
    Par défaut
    Sans respect de la charte de postage, difficile de vous aider .

    A lire et poster le DDL de vos tables ainsi qu'un jeu d'essais :
    http://www.developpez.net/forums/d96...vement-poster/
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 18/11/2005, 12h27
  2. Avoir les "QueryDefs" d'une autre base
    Par Invité dans le forum Access
    Réponses: 1
    Dernier message: 14/09/2005, 10h57
  3. avoir les log d'erreur mysql
    Par simoryl dans le forum Administration
    Réponses: 4
    Dernier message: 06/09/2005, 14h24
  4. [Scripts] Comment avoir les boutons style XP
    Par Didier69 dans le forum Général Dotnet
    Réponses: 26
    Dernier message: 18/05/2005, 15h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo