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 :

Somme de parcours imbriqués


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2012
    Messages : 10
    Points : 12
    Points
    12
    Par défaut Somme de parcours imbriqués
    Bonjour,
    Je tourne ne rond depuis 2 jours. J'ai regardé https://sqlpro.developpez.com/cours/...te-recursives/ et plein d'exemples mais je n'arrive pas aux résultats escomptés.

    J'ai mis des tests sur https://dbfiddle.uk/?rdbms=postgres_...5ee806ca05b61a
    En gros, avec une base du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    CREATE TABLE test (id VARCHAR(255), cnt REAL, rel_id VARCHAR(255));
    INSERT INTO test VALUES
    ('PS479',14.756,'PS606'),
    ('PS779',0.224,'PS479'),
    ('PS377',1.335,'PS479'),
    ('PS386',0.867,'PS377'),
    ('PS667',3.409,'PS479'),
    ('PS650',0.297,'PS667'),
    ('PS291',6.606,'PS479');
    SELECT * FROM test
    ORDER BY id;
    J'aimerais obtenir le résultat suivant :
    PS291
    PS291 6.606
    PS650 0.297
    PS667 3.706 (ce qui correpond à 3.409+0.297 càd PS650+PS667)
    PS386 0.867
    PS377 2.202 (ce qui correpond à 0.867+1.335 càd PS386+PS377)
    PS779 0.224
    PS479 27.494 (la somme de tous les parcours qui arrivent à ce point

    Merci de votre aide ou suggestion

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    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 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Bonjour,
    Vu de loin dans le brouillard, je dirai un truc du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    with cte as
    (
    select id as ident,cnt
    from test
    union
    select rel_id,sum(cnt)
    from test
    group by rel_id
    ) 
    select id,sum(cnt)
    from cte
    group by id
    La première partie pour la valeur "de base", et la deuxième pour la somme des valeurs des lignes "liées".
    Et en sortie la somme total par id.

    Tatayo.

  3. #3
    Membre chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 138
    Points : 1 918
    Points
    1 918
    Par défaut
    Bonjour,

    Tu peux expliquer la logique pour la récursivité ici, car je ne comprends pas l'ordre ou les cumuls?

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    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 198
    Points : 12 774
    Points
    12 774
    Par défaut
    De ce que j'ai compris, pour un id donné on cumule la valeur ce la colonne cnt avec celles des lignes dont rel_id est égal à l'id en question.
    Par exemple la ligne 3 est "liée" aux lignes 4, 5, 7, 9.

    J'avoue que je n'avais pas pensé à une requête récursive.

    Tatayo.

  5. #5
    Membre chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 138
    Points : 1 918
    Points
    1 918
    Par défaut
    ok, un truc comme ça alors:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    select id, sum(cnt)
    from (select id, cnt 
          from test
          union all
          select rel_id, cnt
          from test
       )
    group by id
    order by id

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2012
    Messages : 10
    Points : 12
    Points
    12
    Par défaut
    Bonjour,
    Merci pour votre aide, sauf que je n'ai pas tout a fait ce que je veux. Surtout sur les parcours avec + d'une occurence.
    J'ai fait un schéma
    Pour le point PS479, j'aimerai obtenir 14,756+0,224+2,202( c'est PS377+PS386)+3,706 (c'est PS667+PS0,297) = 27,494 et non pas 26,33
    d’où mon arrache de cheveux
    Nom : reseau.png
Affichages : 64
Taille : 85,5 Ko
    encore merci

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    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 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Donc la seule solution ici est d'utiliser une requête récursive, comme l'indiquait vanagreg.

    Tatayo.

  8. #8
    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
    Merci pour le DBFiddle, excellent initiative.
    Pour votre problème, l'idée c'est de parcourir toutes les branches, il vous faut dans la récursion conserver le point de départ pour faire la somme une fois la récursion terminée.
    https://dbfiddle.uk/?rdbms=postgres_...34aed95c1ef8ba

  9. #9
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2012
    Messages : 10
    Points : 12
    Points
    12
    Par défaut
    You're the best. Je n'aurais jamais pensé à doubler l'Id. Merci beaucoup ! Je vais testé ça sur ma vraie base avec bcp plus de cas.

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

Discussions similaires

  1. parcours de curseurs imbriqués
    Par madina dans le forum PL/SQL
    Réponses: 6
    Dernier message: 26/07/2010, 20h41
  2. Instruction rapide parcours tableau somme
    Par moulery dans le forum SQL
    Réponses: 5
    Dernier message: 05/12/2007, 14h33
  3. [CR ?] Somme d'heure sous Crystal ?
    Par Peter PARKER dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 17/04/2003, 16h24
  4. Ordre de parcours de l'arbre...
    Par Sylvain James dans le forum XML/XSL et SOAP
    Réponses: 3
    Dernier message: 01/12/2002, 18h41
  5. arbre de parcour d'arborescence windows
    Par chupachoc dans le forum Composants
    Réponses: 7
    Dernier message: 09/09/2002, 08h09

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