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 : 33
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : mai 2002
    Messages : 3 173
    Points : 5 335
    Points
    5 335

    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 SGBDR & SQL
    Inscrit en
    mai 2002
    Messages
    15 436
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Expert SGBDR & SQL
    Secteur : Conseil

    Informations forums :
    Inscription : mai 2002
    Messages : 15 436
    Points : 34 575
    Points
    34 575

    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
    Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
    http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
    * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    août 2008
    Messages
    854
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : août 2008
    Messages : 854
    Points : 948
    Points
    948

    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 061
    Détails du profil
    Informations forums :
    Inscription : août 2009
    Messages : 1 061
    Points : 1 782
    Points
    1 782

    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
    854
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : août 2008
    Messages : 854
    Points : 948
    Points
    948

    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 SGBDR & SQL
    Inscrit en
    mai 2002
    Messages
    15 436
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Expert SGBDR & SQL
    Secteur : Conseil

    Informations forums :
    Inscription : mai 2002
    Messages : 15 436
    Points : 34 575
    Points
    34 575

    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
    Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
    http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
    * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *

  8. #8
    Membre chevronné
    Inscrit en
    août 2009
    Messages
    1 061
    Détails du profil
    Informations forums :
    Inscription : août 2009
    Messages : 1 061
    Points : 1 782
    Points
    1 782

    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

    Homme Profil pro
    Ingénieur d'études en décisionnel
    Inscrit en
    septembre 2008
    Messages
    7 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'études en décisionnel
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : septembre 2008
    Messages : 7 288
    Points : 15 320
    Points
    15 320

    Par défaut

    Ça fait un cumul, c'est plutôt très pratique.

  10. #10
    Modérateur

    Profil pro
    Inscrit en
    janvier 2010
    Messages
    4 086
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : janvier 2010
    Messages : 4 086
    Points : 8 204
    Points
    8 204

    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 061
    Détails du profil
    Informations forums :
    Inscription : août 2009
    Messages : 1 061
    Points : 1 782
    Points
    1 782

    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
    Inscrit en
    janvier 2010
    Messages
    4 086
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : janvier 2010
    Messages : 4 086
    Points : 8 204
    Points
    8 204

    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

    Homme Profil pro
    Ingénieur d'études en décisionnel
    Inscrit en
    septembre 2008
    Messages
    7 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'études en décisionnel
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : septembre 2008
    Messages : 7 288
    Points : 15 320
    Points
    15 320

    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 BrunoM45 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