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 :

Compte d'élément d'une branche


Sujet :

Langage SQL

  1. #1
    RLS
    RLS est déconnecté
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 9
    Points : 7
    Points
    7
    Par défaut Compte d'élément d'une branche
    Bonjour,

    j'ai une table de catégories hiérarchiques, et une tables d'éléments pouvant appartenir à une ou plusieurs de ces catégories :

    Categories
    ID
    IDPere
    Libelle

    L_CategoriesElements
    ID
    IDCategorie
    IDElement

    Elements
    ID
    Libelle


    Je voudrais une requete qui m'indique pour chaque catégorie
    1. le nombre d'éléments qu'elle comporte (facile)
    2. le nombre d'éléments qu'elle comporte, tous fils confondus, mais sans doublons d'éléments.



    ex :
    1; null; C1
    2; 1; C2
    3; 1; C3
    4; 3; C4
    5; null; C5

    1; 1 ; 1;
    2; 2 ; 1;
    3; 1 ; 3;
    4; 1 ; 4;
    5; 3 ; 2;
    6; 4 ; 4;
    7; 5 ; 5 ;



    1; E1
    2; E2
    3; E3
    4; E4

    Le résultat devrait etre - libelle - nombre d'éléments, nombres d'éléments totaux :
    C1 ; 3 ; 4
    C2 ; 1 ; 1
    C3 ; 1 ; 2
    C4 ; 1 ; 1
    C5 ; 1 ; 1

    Voilà , je suis un peu bloqué ...
    si quelqu'un peut m'aider avec du code SQL (Transact SQL si possible)

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Vous devriez trouver votre bonheur dans cette publication de SQLPro :
    http://sqlpro.developpez.com/cours/s...te-recursives/

  3. #3
    RLS
    RLS est déconnecté
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    Merci pour ta réponse, mais je pense qu'avec la récursivité, j'aurais des doublons.
    Les éléments appartenant à deux sous catégories seront comptabilisés deux fois dans la catégorie mère.

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Jeu de test :
    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
    DECLARE @Categories TABLE (IdCat TINYINT IDENTITY, IdPere TINYINT, Libelle varchar(2));
    INSERT INTO @Categories (IdPere, Libelle) VALUES (null, 'C1');
    INSERT INTO @Categories (IdPere, Libelle) VALUES (1   , 'C2');
    INSERT INTO @Categories (IdPere, Libelle) VALUES (1   , 'C3');
    INSERT INTO @Categories (IdPere, Libelle) VALUES (3   , 'C4');
    INSERT INTO @Categories (IdPere, Libelle) VALUES (null, 'C5');
     
    DECLARE @L_CatElem TABLE (IdCatElem TINYINT IDENTITY, IdCat TINYINT, IdElem TINYINT);
    INSERT INTO @L_CatElem (IdCat, IdElem) VALUES (1, 1);
    INSERT INTO @L_CatElem (IdCat, IdElem) VALUES (2, 1);
    INSERT INTO @L_CatElem (IdCat, IdElem) VALUES (1, 3);
    INSERT INTO @L_CatElem (IdCat, IdElem) VALUES (1, 4);
    INSERT INTO @L_CatElem (IdCat, IdElem) VALUES (3, 2);
    INSERT INTO @L_CatElem (IdCat, IdElem) VALUES (4, 4);
    INSERT INTO @L_CatElem (IdCat, IdElem) VALUES (5, 5);
     
    DECLARE @Elements TABLE (IdElem TINYINT IDENTITY, Libelle varchar(2));
    INSERT INTO @Elements (Libelle) VALUES ('E1');
    INSERT INTO @Elements (Libelle) VALUES ('E2');
    INSERT INTO @Elements (Libelle) VALUES ('E3');
    INSERT INTO @Elements (Libelle) VALUES ('E4');
    INSERT INTO @Elements (Libelle) VALUES ('E5');
    -- L'élément E5 n'est pas dans votre test mais je suppose qu'il s'agit d'un oubli
    Requête :
    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
    WITH CTECat AS
    (
    select IdCat, IdPere, Libelle, IdCat as InitCat, 1 as lvl
    from @Categories
    union all
    select cat.IdCat, cat.IdPere, cat.Libelle, cte.InitCat, cte.lvl+1
    from
        @Categories as cat
        inner join CTECat as cte
          on cte.IdPere = cat.IdCat
    )
    select
        ct.Libelle,
        count(distinct case lvl when 1 then el.IdElem end) as NbElem,
        count(distinct el.IdElem) as NbElemTot
    from
        CTECat as ct
        inner join @L_CatElem as ce
          on ce.IdCat = ct.InitCat
        inner join @Elements as el
          on el.IdElem = ce.IdElem
    group by
        ct.Libelle
    Résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Libelle NbElem      NbElemTot
    ------- ----------- -----------
    C1      3           4
    C2      1           1
    C3      1           2
    C4      1           1
    C5      1           1

  5. #5
    RLS
    RLS est déconnecté
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    Merci, ça marche bien.

    Je vais essayer de l'adapter pour partir d'une sous-branche.

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

Discussions similaires

  1. tranférer des éléments d'une base
    Par john_wayne dans le forum Décisions SGBD
    Réponses: 1
    Dernier message: 21/06/2004, 15h33
  2. [VB.NET] Enregistrement des éléments d'une listBox
    Par Hoegaarden dans le forum Windows Forms
    Réponses: 9
    Dernier message: 18/05/2004, 14h48
  3. déplacer un élément d'une table
    Par Sph@x dans le forum Requêtes
    Réponses: 3
    Dernier message: 10/02/2004, 12h12
  4. Réponses: 2
    Dernier message: 11/08/2003, 09h43
  5. Pré-sélectionner un élément d'une combobox
    Par delphim dans le forum Composants VCL
    Réponses: 4
    Dernier message: 17/06/2003, 15h26

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