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

Requêtes et SQL. Discussion :

requete de comptage entre 2 table ayant une relation de hierarchie


Sujet :

Requêtes et SQL.

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 63
    Points : 42
    Points
    42
    Par défaut requete de comptage entre 2 table ayant une relation de hierarchie
    Bonjour,

    J'ai 2 tables:
    • t_code-fils(numauto*, cim, ....)

    • t_code-pere(cim*,rub,...)



    Une requête sur chaque table me permets d'avoir:

    • Pour la table t_code-fils: j'obtiens cim et son effectif. C'est à dire que le nombre de fois où le code-fils apparait dans mes données (table code-fils entre 300 000 et 1 000 000 de lignes)


    cim | effectif par cim|
    -----|-----------------|
    A020 | 5
    A021 | 1
    A045 | 3
    A047 | 21
    A048 | 5
    A049 |

    Le code cim est issu d'une hiérarchie et son code-père est composé de ses 3 premiers caractères. Le code-père se trouve dans la table t_pere (3000 lignes)
    Un code-père peut avoir plusieurs code-fils. La requete sur t_code-pere permet de savoir combien ce code-père a de code-fils.

    • Pour la table t_code-pere,


    rub | effectif par rub|
    -----|-------------- |
    A02 | 2
    A04 | 4

    La requête que je cherche, devrait me permettre d'obtenir:

    cim | effectif par cim|rub|effectif par rub|
    -----|-----------------|---|----------------|
    A020 | 5 |A02| 2 |
    A021 | 1 |A02| 2 |
    --------------------------------------------|
    A045 | 3 |A04| 4 |
    A047 | 21 |A04| 4 |
    A048 | 5 |A04| 4 |
    A049 | 0 |A04| 4 |

    J'ai essayé plusieurs types de requêtes: imbriquées, left join... mais je n'arrive pas à obtenir ce résultat.
    J'ai réussi en passant par un 2 tableaux de variables et en faisant 2 boucles imbriquées mais la méthode ne me convient pas.
    Je pense qu'une solution sql existe mais je ne sais laquelle.
    Pouvez vous m'aider ?
    Par avance merci

  2. #2
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 739
    Points
    11 739
    Par défaut
    Je ne suis pas sûr de tout comprendre, mais je te proposerais bien ça, comme base de discussion :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    select P.cim, 
      COUNT(*) as effectif_par_cim, 
      P.rub, 
      COUNT(DISTINCT P.cim) as effectif_par_rub
    from t_code_pere P
      inner join t_code_fils F on F.cim = P.cim
    group by P.cim, P.rub
    order by  P.cim, P.rub

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 63
    Points : 42
    Points
    42
    Par défaut
    Merci pour cette réponse.
    Effectivement cette requête semble être celle que je cherche... mais j'ai un pb indépendant de ma volonté, je travaille sur une base .mdb via VB6.0, mes requêtes se font donc en sql.
    L'association: n'est pas reconnue.
    Une idée pour me sortir de là (sans pour autant changer d'environnement de prog !)

    J'ai mis en PJ ce que je cherche à obtenir (plus clair qu'en format texte)

    (Peut être cette discussion devrait elle être dirigé plutôt sur le forum VB ?)
    Images attachées Images attachées  

  4. #4
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 739
    Points
    11 739
    Par défaut
    Si c'est une base Access, on ne peut effectivement pas utiliser le COUNT(DISTINCT)...

    Il faut utiliser une sous-requête :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT P.cim, 
      SUM(F.nb) AS effectif_par_cim, 
      P.rub, 
      COUNT(F.cim) AS effectif_par_rub
    FROM t_code_pere AS P
      INNER JOIN (SELECT F2.cim, COUNT(numauto) AS nb FROM t_code_fils AS F2 GROUP BY F2.cim ) AS F ON F.cim = P.cim
    GROUP BY P.cim, P.rub
    ORDER BY  P.cim, P.rub

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 63
    Points : 42
    Points
    42
    Par défaut
    Bonjour,
    J’ai bien essayé la requête mais elle ne me donne pas les effectifs de RUB.
    J’ai peut être mal présenté ce que je cherche à obtenir :
    - La table code-pere qui renferme les RUB, et des CIM. Il y a plusieurs CIM par RUB.
    - La table code-fils qui renferme les CIM avec leurs effectifs.

    Je cherche à obtenir: RUB, effectif de RUB, CIM, effectif de CIM.

    Effectif de RUB tant:

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT rub, COUNT(cim)
    FROM t_code_pere
    GROUPBY rub

    Je mets en PJ une présentation de mes 2 tables et celle que je cherche à obtenir.
    Merci à toi.
    Images attachées Images attachées  

  6. #6
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 739
    Points
    11 739
    Par défaut
    Tu as déjà l'effectif par CIM dans ta table-fille ?

    Dans ce cas, c'est beaucoup plus simple.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT P.rub, COUNT(P.cim) as effectif_par_rub, P.cim, SUM(F.effectif) as effectif_par_cim
    FROM t_code_pere AS P
      inner join t_code_fils AS F on P.cim = F.cim
    GROUP BY P.rub

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 63
    Points : 42
    Points
    42
    Par défaut
    N'y arrivant pas, j'ai finalement fait une requete qui me donne l'effectif dans ma table fille. Mais la situation n'est pas idéale.
    Il est vrai que ce que je voudrais idéalement c'est pouvoir obtenir la table décrite en partant de la table pere et la table fille native. Ce qui je pense est plus rapide pour le traitement et plus simple en code vb.
    Dons si tu vois comment faire, je suis toujours preneur.
    Merci

  8. #8
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 739
    Points
    11 739
    Par défaut
    OK... alors explique-moi ce qui n'est pas bon dans les requêtes que je t'ai proposé.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 63
    Points : 42
    Points
    42
    Par défaut
    Bonsoir,
    Quand exécute la requête, j’obtiens la table réponse ci jointe.
    Ce que je souhaiterai , c’est obtenir l’effectif de rub globale pour chaque RUB.
    Par exemple, RUB A04 étant père des codes A045, A047, A048, A049, il faudrait que sur chacune des lignes de CIM différents apparaissent dans effectif_par_rub: 4 (puisque père de 4 codes).
    J’ai essayé de mon coté mais je fais toujours chou blanc.
    Images attachées Images attachées  

  10. #10
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 739
    Points
    11 739
    Par défaut
    ok !

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT P.cim, 
      COUNT(*) AS effectif_par_cim, 
      P.rub, 
      ER.eff_par_rub
    FROM t_code_pere AS P
      INNER JOIN (SELECT rub, COUNT(*) AS eff_par_rub FROM t_code_pere GROUP BY rub) AS ER 
        ON P.rub = ER.rub
      INNER JOIN t_code_fils AS F ON F.cim = P.cim
    GROUP BY P.cim, P.rub
    ORDER BY  P.cim, P.rub

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 63
    Points : 42
    Points
    42
    Par défaut
    Un grand merci pour ton aide.
    En intégrant ton code, quand je l'ai lancé, une erreur "code absent dans le join" s'est produite.
    Je n'ai pas réussi à la trouver MAIS j'ai repris ta requête, l'ai revu à ma façon en me l'appropriant et ça marche.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    select f.cim, count(f.num) as eff_observ, S.rub, S.eff_theo
    from t_code_fils f 
    	inner join 
    		(select p1.cim, r.rub, r.eff_theo
    		from t_code_pere p1 
    			left join (select p.rub, count(p.num) as eff_theo
    				   from t_code_pere p
    		   		   group by p.rub) as r
    			on p1.rub=r.rub) as S
    	on f.cim=S.cim
    group by f.cim, S.rub, S.eff_theo
    Je n'ai pas une grande pratique du sql. J'avais complétement oublié que l'on pouvait imbriquer les requêtes façon poupées russes voir boucler sur elles-même.
    Grâce à ton aide,
    -je vois la fin de cet épineux problème
    -j'ai gagné une requête dynamique
    -j'ai redécouvert des propriétés du sql.
    -....
    ==> que du bonheur.

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

Discussions similaires

  1. lien entre les tables d'une base de données Mysql
    Par chifa dans le forum Requêtes
    Réponses: 1
    Dernier message: 23/10/2007, 13h42
  2. Probleme de liaison entre deux tables d'une base de donnees
    Par blondelle dans le forum C++Builder
    Réponses: 32
    Dernier message: 12/04/2007, 19h09
  3. Table avec lignes ayant une relation "père-fils"
    Par the java lover dans le forum Windows Forms
    Réponses: 7
    Dernier message: 02/04/2007, 12h20
  4. Récupérer les relations entre les tables d'une bdd
    Par FRED.G dans le forum Accès aux données
    Réponses: 1
    Dernier message: 16/01/2007, 14h07
  5. Requete sql pour création de table dans une base access
    Par Ben156 dans le forum Bases de données
    Réponses: 1
    Dernier message: 17/01/2006, 23h12

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