Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 14 sur 14
  1. #1
    Invité de passage
    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 : 3
    Points
    3

    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é Sénior
    Homme Profil pro
    Inscrit en
    mai 2002
    Messages
    3 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : mai 2002
    Messages : 3 077
    Points : 5 080
    Points
    5 080

    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 Frédéric BROUARD
    Expert SGBDR & SQL
    Inscrit en
    mai 2002
    Messages
    13 560
    Détails du profil
    Informations personnelles :
    Nom : Homme Frédéric BROUARD
    Localisation : France

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

    Informations forums :
    Inscription : mai 2002
    Messages : 13 560
    Points : 30 054
    Points
    30 054

    Par défaut

    En SQL normatif :

    Code :
    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 émérite
    Inscrit en
    août 2008
    Messages
    854
    Détails du profil
    Informations forums :
    Inscription : août 2008
    Messages : 854
    Points : 938
    Points
    938

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

    Par défaut

    C'est l'utilisation du COUNT avec ORDER BY qui me semble pour le moins étrange.

    Code :
    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 :
    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
    Inscrit en
    août 2008
    Messages
    854
    Détails du profil
    Informations forums :
    Inscription : août 2008
    Messages : 854
    Points : 938
    Points
    938

    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 Frédéric BROUARD
    Expert SGBDR & SQL
    Inscrit en
    mai 2002
    Messages
    13 560
    Détails du profil
    Informations personnelles :
    Nom : Homme Frédéric BROUARD
    Localisation : France

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

    Informations forums :
    Inscription : mai 2002
    Messages : 13 560
    Points : 30 054
    Points
    30 054

    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 Expert
    Inscrit en
    août 2009
    Messages
    1 046
    Détails du profil
    Informations forums :
    Inscription : août 2009
    Messages : 1 046
    Points : 1 750
    Points
    1 750

    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 Fabien
    Ingénieur d'études en décisionnel
    Inscrit en
    septembre 2008
    Messages
    6 865
    Détails du profil
    Informations personnelles :
    Nom : Homme Fabien
    Âge : 36
    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 : 6 865
    Points : 14 237
    Points
    14 237

    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
    3 087
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : janvier 2010
    Messages : 3 087
    Points : 5 666
    Points
    5 666

    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 :
    1
    2
     COUNT(*) OVER (ORDER BY colonne)
    Ou alors on a loupé quelque chose ?

  11. #11
    Membre Expert
    Inscrit en
    août 2009
    Messages
    1 046
    Détails du profil
    Informations forums :
    Inscription : août 2009
    Messages : 1 046
    Points : 1 750
    Points
    1 750

    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
    3 087
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : janvier 2010
    Messages : 3 087
    Points : 5 666
    Points
    5 666

    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 Fabien
    Ingénieur d'études en décisionnel
    Inscrit en
    septembre 2008
    Messages
    6 865
    Détails du profil
    Informations personnelles :
    Nom : Homme Fabien
    Âge : 36
    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 : 6 865
    Points : 14 237
    Points
    14 237

    Par défaut

    Ça fonctionne enfin chez MS avec SQL-Server 2012.

  14. #14
    Invité de passage
    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 : 3
    Points
    3

    Par défaut

    Merci a tous j'ai pu réussir a faire tout ca !! =)

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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •