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

  1. #1
    Futur Membre du Club
    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
    Points : 6
    Points
    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 : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    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
    21 760
    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 : 21 760
    Points : 52 541
    Points
    52 541
    Billets dans le blog
    5
    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 éprouvé
    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
    Points : 965
    Points
    965
    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 chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    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 éprouvé
    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
    Points : 965
    Points
    965
    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
    21 760
    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 : 21 760
    Points : 52 541
    Points
    52 541
    Billets dans le blog
    5
    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/ * * * * *

  8. #8
    Membre chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    Par défaut
    Citation Envoyé par Snipah Voir le message
    C'est pourtant correct, mais ça correspond à un besoin différent.
    À quoi est censé correspondre COUNT(*) OVER (ORDER BY colonne) ? Vous comptez de manière différente selon l'ordre dans lequel vous lisez les lignes ?

  9. #9
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Ça fait un cumul, c'est plutôt très pratique.

  10. #10
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Waldar, tu peux préciser ?

    Je pense comme Rei Ichido, qui s'interroge sur l'interet d'un tri avec le COUNT...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     COUNT(*) OVER (ORDER BY colonne)
    Ou alors on a loupé quelque chose ?

  11. #11
    Membre chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    Par défaut
    Ok, effectivement sous Oracle ça fonctionne bien en cumul ; par contre sous SQL Server 2008, ça ne passe pas.
    J'aurais appris quelque chose \o/

  12. #12
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Citation Envoyé par Rei Ichido Voir le message
    Ok, effectivement sous Oracle ça fonctionne bien en cumul ; par contre sous SQL Server 2008, ça ne passe pas.
    ...
    Citation Envoyé par aieeeuuuuu Voir le message
    Ou alors on a loupé quelque chose ?
    C'était donc ça !

  13. #13
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Ça fonctionne enfin chez MS avec SQL-Server 2012.

  14. #14
    Futur Membre du Club
    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
    Points : 6
    Points
    6
    Par défaut
    Merci a tous j'ai pu réussir a faire tout ca !! =)

+ 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