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 :

Problème avec un count et une imbrication


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Inscrit en
    Juillet 2009
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 24
    Points : 13
    Points
    13
    Par défaut Problème avec un count et une imbrication
    Bonjour, j'ai un petit soucis sur la formulation d'une requête SQL.
    Je vous explique la situation :

    J'ai différent type de données :
    - Des périmètres (finance, vie, iard-fo...)
    - Des applications (RRCI, AXAN sur 4 lettres, chaque appli appartenant à 1 périmètre)
    - Des Jobsets (sous la forme PAFA-AAXA-001M, chaque Jobset appartenant à une appli)
    - Des Jobs (sous la forme PAAXA-001M-005M, chaque Job appartenant à un Jobset)

    --> Exemple d'une ligne :

    Perimetre application Nom du Jobset Nom de Job
    IARD-FO AAXA PAFA-AAXA-001M PAAXA-001M-005M

    La requête que j'envoi join la table perimetre,appli,jobset et job pour récupérer le nombre total de job par jobset par appli par périmètre. Au final j'aimerais avoir quelque chose dans le style :

    Perimetre application Nom du Jobset Nombre total de Job
    IARD-FO AAXA PAFA-AAXA-001M 39

    Ma requête est initialement comme ci dessous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT PERIMETRE.NOMPERIMETRE AS 'Nom du Perimetre', APPLI.NOMAPPLI AS 'Nom de l\'application', JOBSET.NOMJOBSET AS 'Nom du Jobset', JOB.NOMJOB AS 'Nombre total de Jobs' 
    FROM JOB 
    INNER JOIN JOBSET ON (JOB.JOBSET_IDJOBSET=JOBSET.IDJOBSET)
    INNER JOIN APPLI ON (APPLI.IDAPPLI=JOBSET.APPLI_IDAPPLI)
    INNER JOIN PERIMETRE ON (APPLI.PERIMETRE_IDPERIMETRE=PERIMETRE.IDPERIMETRE)    
    GROUP BY JOB.NOMJOB
    HAVING SUBSTR(JOB.NOMJOB,2,9)=SUBSTR(JOBSET.NOMJOBSET,6,9)
    Cette requête fonctionne parfaitement elle m'affiche le listing des jobs par jobsets par appli... Seul problème, des que je place mon COUNT, cela m'affiche ceci:

    Nom du Perimetre Nom de l'application Nom du Jobset Nombre total de Jobs
    IARD-FO AAXA PAFA-AAXA-001M 1
    VIE ABON PAFA-ABON-001Q 1
    VIE ABON PAFA-ABON-002Q 1...

    Je me suis ensuite posé la question : est-ce que je dois faire une requête imbriquée c'est à dire, afficher en un premier temps tout et par la suite compter ?

    Seul problème c'est que je ne vois pas comment formuler tout ca.

    Si quelqu'un a une idée et surtout un peu de temps à me consacrer ca serait formidable. Merci d'avance.

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 106
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 106
    Points : 28 394
    Points
    28 394
    Par défaut
    Quel est ce SGBD qui autorise de placer dans la liste des colonnes sélectionnées des colonnes qui n'apparaissent pas dans la clause GROUP BY ?

  3. #3
    Membre à l'essai
    Inscrit en
    Juillet 2009
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 24
    Points : 13
    Points
    13
    Par défaut
    Je tourne sur mysql sur interface phpmyadmin. Vraiment pas top mais on fait avec les moyens du bord manque de budget...

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 106
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 106
    Points : 28 394
    Points
    28 394
    Par défaut
    Il existe de nombreux SGBD gratuits qui respectent la syntaxe normalisée du langage SQL...

  5. #5
    Membre à l'essai
    Inscrit en
    Juillet 2009
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 24
    Points : 13
    Points
    13
    Par défaut
    Et selon vous quelle est la bonne synthaxe. Cela m'aiderais peut être ?

  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
    Bonjour,

    MySQL tolère que l'on place dans la liste des colonnes sélectionnées des colonnes qui n'apparaissent pas dans la clause GROUP BY, mais je crois bien qu'implicitement il les considère comme étant dedans.
    Comme le fait remarquer al1_24, c'est en principe une erreur de syntaxe, et du coup une source de confusion. Ca peut également donner de mauvaises habitudes aux personnes qui n'utilisent que MySQL.
    Vous faites un GROUP BY NOM_JOB, alors qu'en réalité c'est sur toutes les autres colonnes que doit porter votre regroupement si vous souhaitez avoir le nombre de jobs par jobset/appli/perimetre.
    Si vous souhaitez afficher à la fois le détail (liste de job) et le nombre de job par jobset, MySQL ne permettant pas les fonctions de fenetrage, il va falloir passer par une sous-requête.

    Dernier point, votre clause HAVING n'en est pas une, ça ressemble plutôt à une condition de jointure ou une clause WHERE.

    Maintenant, la requête. Vous pouvez la faire de plusieurs façon, je vous propose celle-ci, on récupère dans un premier temps les infos perimetre/appli/jobset/NbJobs, puis on joint avec la table des jobs pour récupérer la liste des jobs par jobset :
    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
    20
    21
    22
    23
    24
     
    SELECT
          R1.NOMPERIMETRE,
          R1.NOMAPPLI,
          R1.NOMJOBSET,
          JOB.NOMJOB,
          R1.NbJobs
    FROM
    (
        SELECT 
               PERIMETRE.NOMPERIMETRE, 
               APPLI.NOMAPPLI, 
               JOBSET.NOMJOBSET, 
               JOBSET.IDJOBSET,
               count(*) AS NbJobs
        FROM PERIMETRE 
        INNER JOIN APPLI ON APPLI.PERIMETRE_IDPERIMETRE=PERIMETRE.IDPERIMETRE
        INNER JOIN JOBSET ON APPLI.IDAPPLI=JOBSET.APPLI_IDAPPLI
        INNER JOIN JOB ON JOB.JOBSET_IDJOBSET=JOBSET.IDJOBSET
                       AND SUBSTR(JOB.NOMJOB,2,9)=SUBSTR(JOBSET.NOMJOBSET,6,9)
        GROUP BY JOBSET.NOMJOBSET, JOBSET.IDJOBSET, APPLI.NOMAPPLI, PERIMETRE.NOMPERIMETRE
    ) R1
    INNER JOIN JOB ON JOB.JOBSET_IDJOBSET=R1.IDJOBSET
                   AND SUBSTR(JOB.NOMJOB,2,9)=SUBSTR(JOBSET.NOMJOBSET,6,9)

  7. #7
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 106
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 106
    Points : 28 394
    Points
    28 394
    Par défaut
    Tout sur la syntaxe des requêtes de regroupement : Groupage, ensembles et sous ensembles

  8. #8
    Membre à l'essai
    Inscrit en
    Juillet 2009
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 24
    Points : 13
    Points
    13
    Par défaut
    J'ai envoyé la requête mais le message qui est renvoyé est le suivant :

    #1054 - Unknown column 'JOB.NOMJOB' in 'having clause'

    Je ne vois pas trop pourquoi ce message, j'ai tordu la requête dans tout les sens et quand ce n'est pas le message du dessus c'est celui-ci :

    #1054 - Unknown column 'JOBSET.NOMJOBSET' in 'having clause'

    Sinon j'ai uniquement besoin d'afficher les données suivantes (les noms des jobs ne me sont pas nécessaires) :

    Nom de périmètre (PERIMETRE.NOMPERIMETRE), Nom d'appli (APPLI.NOMAPPLI), Nom du jobset (JOBSET.NOMJOBSET) et le nombre de job de ce jobset

    Je dois passer à coté de quelque chose ou je dois peut être comprendre à l'envers mais depuis ce matin je suis sur cette requête et elle me donne du file à retorde !

    Merci beaucoup pour les réponses

  9. #9
    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
    Pourquoi avez vous encore une clause having? Elle est inutile.
    Quelle est le requête exacte que vous avez essayé?

    Si vous n'avez pas besoin du detail des jobs, alors tout simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        SELECT 
               PERIMETRE.NOMPERIMETRE, 
               APPLI.NOMAPPLI, 
               JOBSET.NOMJOBSET, 
               count(*) AS NbJobs
        FROM PERIMETRE 
        INNER JOIN APPLI ON APPLI.PERIMETRE_IDPERIMETRE=PERIMETRE.IDPERIMETRE
        INNER JOIN JOBSET ON APPLI.IDAPPLI=JOBSET.APPLI_IDAPPLI
        INNER JOIN JOB ON JOB.JOBSET_IDJOBSET=JOBSET.IDJOBSET
                       AND SUBSTR(JOB.NOMJOB,2,9)=SUBSTR(JOBSET.NOMJOBSET,6,9)
        GROUP BY JOBSET.NOMJOBSET, APPLI.NOMAPPLI, PERIMETRE.NOMPERIMETRE

  10. #10
    Membre à l'essai
    Inscrit en
    Juillet 2009
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 24
    Points : 13
    Points
    13
    Par défaut
    Parfois je me demande pourquoi mon cerveau réfléchit de la sorte !

    Bah la requête que vous venez de me donner fonctionne merveilleusement bien... Je me suis compliqué la vie pour rien.
    Seule chose à laquelle je n'aurais pas pensé c'est le AND dans le FROM, ça ne m'es pas intuitif...

    Merci beaucoup pour l'aide donné ça m'a fait avancé a très bientôt !

  11. #11
    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
    Citation Envoyé par zoharcryss Voir le message
    Seule chose à laquelle je n'aurais pas pensé c'est le AND dans le FROM, ça ne m'es pas intuitif...
    En fait, c'est simplement une condition de jointure.
    On joint les lignes des tables JOB et JOBSET sur les conditions JOB.JOBSET_IDJOBSET=JOBSET.IDJOBSET ET SUBSTR(JOB.NOMJOB,2,9)=SUBSTR(JOBSET.NOMJOBSET,6,9).

    On aurait pu mettre cette condition dans une clause WHERE, ça marche aussi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        SELECT 
               PERIMETRE.NOMPERIMETRE, 
               APPLI.NOMAPPLI, 
               JOBSET.NOMJOBSET, 
               count(*) AS NbJobs
        FROM PERIMETRE 
        INNER JOIN APPLI ON APPLI.PERIMETRE_IDPERIMETRE=PERIMETRE.IDPERIMETRE
        INNER JOIN JOBSET ON APPLI.IDAPPLI=JOBSET.APPLI_IDAPPLI
        INNER JOIN JOB ON JOB.JOBSET_IDJOBSET=JOBSET.IDJOBSET
        WHERE SUBSTR(JOB.NOMJOB,2,9)=SUBSTR(JOBSET.NOMJOBSET,6,9)
        GROUP BY JOBSET.NOMJOBSET, APPLI.NOMAPPLI, PERIMETRE.NOMPERIMETRE
    Mais comme il s'agit d'une égalité entre deux colonnes de deux tables différentes, elle est plus à sa place au niveau de la jointure.

    Soit dit en passant, je ne sais pas si ça peut arriver, mais dans le cas où un JOBSET ne contient aucun job, il ne remontera pas. A vous de traiter le cas si vous voulez l'afficher quand même, avec 0 en NbJobs.

  12. #12
    Membre à l'essai
    Inscrit en
    Juillet 2009
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 24
    Points : 13
    Points
    13
    Par défaut
    Je comprend mieux maintenant !

    Pour les Jobsets ne contenant pas de Jobs c'est une situation qui en principe ne peut pas arriver donc sur ce coup la je suis tranquille !

    En tout cas chapeau bas !

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

Discussions similaires

  1. Problème de 0 avec un Count dans une requête
    Par Exentius dans le forum Requêtes
    Réponses: 4
    Dernier message: 08/12/2010, 08h52
  2. problèmes avec "include file" pour une page asp
    Par chipsense dans le forum ASP
    Réponses: 1
    Dernier message: 02/09/2005, 15h22
  3. [Débutant] Problème avec les paramètres d'une proc stockée
    Par babulior dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 28/06/2005, 15h38
  4. Problèmes avec un TWebBrowser dans une DLL
    Par bellamyjc dans le forum Composants VCL
    Réponses: 2
    Dernier message: 12/01/2005, 22h35
  5. Problème avec un LIKE dans une procédure stockée
    Par Oluha dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 22/12/2004, 14h38

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