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 :

Compléter une requête avec max et count


Sujet :

Langage SQL

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 10
    Points : 5
    Points
    5
    Par défaut Compléter une requête avec max et count
    Bonjour j'aimerai construire une requête sur les trois tables suivant:
    GROUPE(id, nom)
    AUTEUR((id, nom, idgroupe)
    ARTICLES(id, titre, texte, idauteur)

    J'aimerais retourner le/les noms des groupes ayant posté le plus d'articles ?
    avec la requete suivante je retourne une liste des groupes ainsi que le nombre d'articles postés par le groupe mais je n'arrive pas à compléter la requete pour ne retourner que le MAX seulement. j'ai essayé Max(COUNT( "articles"."id" )) mais ça ne fonctionne pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT COUNT( "articles"."id" ), "groupe"."nom" FROM "articles", "auteur", "groupe" WHERE "articles"."idauteur" = "auteur"."id" AND "auteur"."idgroupe" = "groupe"."id" GROUP BY "groupe"."nom"
    Merci

  2. #2
    Membre éclairé Avatar de bstevy
    Homme Profil pro
    Solutions Architect
    Inscrit en
    Mai 2009
    Messages
    552
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Japon

    Informations professionnelles :
    Activité : Solutions Architect
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2009
    Messages : 552
    Points : 870
    Points
    870
    Par défaut
    Salut,


    Alors première chose, car si c'est pas moi qui te le dit, ca sera un autre et ca sera moins sympa ^^
    Pense à écrire tes jointures avec "inner join" plutot que dans la clause "where"

    Le plus simple pour avoir ton résultat, c'est tout simplement de trier par ta colonne de count, et ta premiere ou tes premières lignes seront les max :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT	COUNT( articles.id ), 
    	groupe.nom 
    FROM articles
    INNER JOIN auteur	on articles.idauteur = auteur.id
    INNER JOIN groupe	on auteur.idgroupe = groupe.id
    GROUP BY groupe.nom
    ORDER BY 1 DESC
    ;
    Mais je pense que tu ne veux selectionner que ces lignes là, non ?
    Le max(count()) ne fonctionne pas forcément sur tous les SGBD.

    Tu peux tester un truc comme ca, c'est un peu lourd mais ca devrait fonctionner.
    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
    SELECT	COUNT( articles.id ), 
    	groupe.nom 
    FROM articles
    INNER JOIN auteur	on articles.idauteur = auteur.id
    INNER JOIN groupe	on auteur.idgroupe = groupe.id
    GROUP BY groupe.nom
    HAVING COUNT( articles.id ) =	(	select max(nb)
    					from	(	SELECT	COUNT( articles.id ) nb
    							FROM articles
    							INNER JOIN auteur	on articles.idauteur = auteur.id
    							INNER JOIN groupe	on auteur.idgroupe = groupe.id
    							GROUP BY groupe.nom
    						)
    				)
    ;

  3. #3
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 017
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 017
    Points : 40 932
    Points
    40 932
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par bstevy Voir le message
    Tu peux tester un truc comme ça, c'est un peu lourd mais ça devrait fonctionner.
    Lourd effectivement alors qu'il suffit de récupérer le premier résultat, (première ligne) de ta première requête,
    bien sûr cela dépend , encore, du SGBD utilisé
    et ce grâce au ORDER BY
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 184
    Points : 12 733
    Points
    12 733
    Par défaut
    Bonjour,
    Citation Envoyé par SergioMaster Voir le message
    Lourd effectivement alors qu'il suffit de récupérer le premier résultat, (première ligne) de ta première requête,
    bien sûr cela dépend , encore, du SGBD utilisé
    et ce grâce au ORDER BY
    Pas forcément, car en cas d'égalité, qui sort vainqueur ?

    Tatayo.

  5. #5
    Membre éclairé Avatar de bstevy
    Homme Profil pro
    Solutions Architect
    Inscrit en
    Mai 2009
    Messages
    552
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Japon

    Informations professionnelles :
    Activité : Solutions Architect
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2009
    Messages : 552
    Points : 870
    Points
    870
    Par défaut
    C'est vraiment chiant que ces requetes de 'top N' ne soient absolument pas harmonisée entre tous les sgbd...

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 716
    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 716
    Points : 52 380
    Points
    52 380
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    Lourd effectivement alors qu'il suffit de récupérer le premier résultat, (première ligne) de ta première requête,
    bien sûr cela dépend , encore, du SGBD utilisé
    et ce grâce au ORDER BY
    Le conseil que vous donnez est stupide. Un ORDER BY n'étant pas relationnel, vous n'obtiendrez JAMAIS une réponse cohérente via la l'utiliation de la cluase ORDER BY par rapport à la question demandée...

    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/ * * * * *

  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 716
    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 716
    Points : 52 380
    Points
    52 380
    Billets dans le blog
    4
    Par défaut
    La solution efficace, juste et élégante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    WITH T AS
    (
    SELECT g.nom, RANK() OVER(ORDER BY COUNT(*)DESC) AS RANG
    FROM   GROUPE AS g
           INNER JOIN AUTEUR AS a
    	         ON g.id = a.idgroupe
           INNER JOIN ARTICLES AS r
    	         ON a.id = r.idauteur
    GROUP  BY g.nom
    )
    SELECT nom
    FROM   T
    WHERE  RANG = 1;
    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/ * * * * *

  8. #8
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 716
    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 716
    Points : 52 380
    Points
    52 380
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    Lourd effectivement alors qu'il suffit de récupérer le premier résultat, (première ligne) de ta première requête,
    bien sûr cela dépend , encore, du SGBD utilisé
    et ce grâce au ORDER BY
    parfaietement idiot !!!!!

    Que faites vous en cas d'ex aequo ? Personnelement en tant que chef d'entreprise, je vire l'informaticien que vous êtes !

    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/ * * * * *

  9. #9
    Membre éclairé Avatar de bstevy
    Homme Profil pro
    Solutions Architect
    Inscrit en
    Mai 2009
    Messages
    552
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Japon

    Informations professionnelles :
    Activité : Solutions Architect
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2009
    Messages : 552
    Points : 870
    Points
    870
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    La solution efficace, juste et élégante :
    Le seul truc qui me pose problème, c'est qu'a mon avis, c'est un exercice scolaire... en tout cas, l'ennoncé y ressemble bien. et donc de ce fait, utiliser une fonction de fenetrage fait "j'ai pompé sur internet" lol

  10. #10
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Citation Envoyé par bstevy Voir le message
    C'est vraiment chiant que ces requetes de 'top N' ne soient absolument pas harmonisée entre tous les sgbd...
    On peut considérer qu'elles le sont via les fonctions analytiques (fenêtrage) normative rank / row_number, mais tous les SGBD ne les ont pas implémentées.
    Par ailleurs il peut y avoir des optimisations spécifiques au top N non inclues dans rank / row_number, c'était vraie sur Oracle en version 9 (et peut être aussi en version 10, je ne sais plus) avant unification de l'optimisation (STOP KEY dans le plan d'exécution).

  11. #11
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 017
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 017
    Points : 40 932
    Points
    40 932
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    parfaitement idiot !!!!!

    Que faites vous en cas d'ex aequo ? Personnelement en tant que chef d'entreprise, je vire l'informaticien que vous êtes !
    Simplement fatigué et n'ayant pas lu l'énoncé en entier
    toujours aussi aimable , Mr SQLPro ? levé du pied gauche ? en ce cas en tant que chef d'entreprise faites attention aux fautes d'orthographe (on peut jouer longtemps à ce petit jeu)
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  12. #12
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 059
    Points : 38 269
    Points
    38 269
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par bstevy Voir le message
    Le seul truc qui me pose problème, c'est qu'a mon avis, c'est un exercice scolaire... en tout cas, l'ennoncé y ressemble bien. et donc de ce fait, utiliser une fonction de fenetrage fait "j'ai pompé sur internet" lol
    Savoir trouver une solution, que ce soit via internet, la littérature, ou l'appel à un ami est aussi une qualité.
    Encore faut il avoir ensuite la mettre en œuvre dans le contexte

  13. #13
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 059
    Points : 38 269
    Points
    38 269
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    Simplement fatigué et n'ayant pas lu l'énoncé en entier
    toujours aussi aimable , Mr SQLPro ? levé du pied gauche ? en ce cas en tant que chef d'entreprise faites attention aux fautes d'orthographe (on peut jouer longtemps à ce petit jeu)
    Le chef d'entreprise qui vire un collabo a la première erreur se retrouve très vite seul
    Il est beaucoup plus efficace et productif de comprendre d'où vient l'erreur (pas de qui) pour trouver les améliorations requises de sortes à ce qu'elles ne se reproduisent pas, ou en tout cas le moins souvent possible.
    Tout ça n'excluant évidemment pas un minimum de diplomatie

  14. #14
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 716
    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 716
    Points : 52 380
    Points
    52 380
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    toujours aussi aimable , Mr SQLPro ?
    Oui, c'est à ça qu'on me reconnait avec certitude !!!
    levé du pied gauche ?
    Non, mais pas du tout adepte du consensus mou ni du politiquement correct... pas le temps, je ne suis pas fonctionnaire. j'apelle un chat un chat que ça plaise ou non !!!
    en ce cas en tant que chef d'entreprise faites attention aux fautes d'orthographe (on peut jouer longtemps à ce petit jeu)
    C'est vrai, je suis dyslexique et ça s'arrange pas en vieillissant !

    Merci de mes les indiquer que je corrige pour la postérité !

    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/ * * * * *

  15. #15
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par bstevy Voir le message
    Le seul truc qui me pose problème, c'est qu'a mon avis, c'est un exercice scolaire... en tout cas, l'ennoncé y ressemble bien. et donc de ce fait, utiliser une fonction de fenetrage fait "j'ai pompé sur internet" lol
    Les gars ! je vous remercie beaucoup pour vos reponses satisfaisantes. effectivement c'est un exercice dans le cadre d'un projet scolaire, l'objectif aitant de nous apprendre comment fonctionne la chose, donc autant apprendre par tous les moyens qui nous sont possibles.

    Merci

  16. #16
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 059
    Points : 38 269
    Points
    38 269
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par sergeants Voir le message
    Les gars ! je vous remercie beaucoup pour vos reponses satisfaisantes. effectivement c'est un exercice dans le cadre d'un projet scolaire, l'objectif aitant de nous apprendre comment fonctionne la chose, donc autant apprendre par tous les moyens qui nous sont possibles.

    Merci
    Si tu as les bonnes réponses, peut être que le "Sergeants" finira Major de sa promotion
    OK je sors !

  17. #17
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    Si tu as les bonnes réponses, peut être que le "Sergeants" finira Major de sa promotion
    OK je sors !
    Lol trop marrant "escartefigue" l'objectif n'était pas du tout de trouver des reponses mais de comprendres comment cela fonctionne et crois moi j'ai beaucoup appris et cela m'a permi de resoudre pas mal de mes problemes. Donc merci à tous !

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

Discussions similaires

  1. Besoin d'aide sur une requête avec un MAX()
    Par lcristin dans le forum Langage SQL
    Réponses: 5
    Dernier message: 05/03/2013, 15h57
  2. Optimiser une requête avec MAX()
    Par domiq44 dans le forum SQL
    Réponses: 6
    Dernier message: 19/11/2009, 11h55
  3. une requête avec 2 count sur la même table
    Par epeichette dans le forum Requêtes
    Réponses: 11
    Dernier message: 30/06/2009, 10h19
  4. Une requête avec un Max sur 2 champs
    Par Bils dans le forum Langage SQL
    Réponses: 4
    Dernier message: 17/09/2007, 15h04
  5. Requête avec MAX et COUNT
    Par arno a. dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 16/04/2007, 15h02

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