Précédent   Forum du club des développeurs et IT Pro > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 08/01/2013, 14h09   #1
quentinlegeek01
Invité de passage
 
Homme
Lycéen
Inscription : 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.
quentinlegeek01 est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 08/01/2013, 14h16   #2
punkoff
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 2 206
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 30
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 2 206
Points : 3 564
Points : 3 564
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
punkoff est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2013, 09h27   #3
SQLpro
Rédacteur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 12 163
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 : 12 163
Points : 21 855
Points : 21 855
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 * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2013, 09h57   #4
Snipah
Membre émérite
 
Inscription : août 2008
Messages : 854
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 854
Points : 837
Points : 837
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
Snipah est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2013, 10h42   #5
Rei Ichido
Membre Expert
 
Inscription : août 2009
Messages : 1 013
Détails du profil
Informations forums :
Inscription : août 2009
Messages : 1 013
Points : 1 533
Points : 1 533
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.
Rei Ichido est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2013, 11h47   #6
Snipah
Membre émérite
 
Inscription : août 2008
Messages : 854
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 854
Points : 837
Points : 837
Citation:
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.
Snipah est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2013, 11h47   #7
SQLpro
Rédacteur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 12 163
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 : 12 163
Points : 21 855
Points : 21 855
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 * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2013, 11h52   #8
Rei Ichido
Membre Expert
 
Inscription : août 2009
Messages : 1 013
Détails du profil
Informations forums :
Inscription : août 2009
Messages : 1 013
Points : 1 533
Points : 1 533
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 ?
Rei Ichido est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2013, 12h01   #9
Waldar
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 6 278
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 35
Localisation : France, Essonne (Î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 278
Points : 13 480
Points : 13 480
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Ça fait un cumul, c'est plutôt très pratique.
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2013, 12h43   #10
aieeeuuuuu
Expert Confirmé
 
Inscription : janvier 2010
Messages : 1 805
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 805
Points : 2 885
Points : 2 885
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 ?
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2013, 13h24   #11
Rei Ichido
Membre Expert
 
Inscription : août 2009
Messages : 1 013
Détails du profil
Informations forums :
Inscription : août 2009
Messages : 1 013
Points : 1 533
Points : 1 533
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/
Rei Ichido est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2013, 13h49   #12
aieeeuuuuu
Expert Confirmé
 
Inscription : janvier 2010
Messages : 1 805
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 805
Points : 2 885
Points : 2 885
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 !
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2013, 14h21   #13
Waldar
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 6 278
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 35
Localisation : France, Essonne (Î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 278
Points : 13 480
Points : 13 480
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Ça fonctionne enfin chez MS avec SQL-Server 2012.
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2013, 16h02   #14
quentinlegeek01
Invité de passage
 
Homme
Lycéen
Inscription : 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
Merci a tous j'ai pu réussir a faire tout ca !! =)
quentinlegeek01 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 11h33.


 
 
 
 
Partenaires

Hébergement Web