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

XQUERY/SGBD XML Discussion :

Fonction AVG (MOYENNE ) sur base d'attributs


Sujet :

XQUERY/SGBD XML

  1. #1
    Membre à l'essai
    Fonction AVG (MOYENNE ) sur base d'attributs
    Bonjour, je cherche à calculer une moyenne sur base d’attributs :

    A partir d’un fichier XML :
    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
    <?xml version="1.0" encoding="ISO-8859-1" ?>
    <?xml-stylesheet href="class.xsl" type="text/xsl" ?>
    <université>
    <étudiant><nom>Réjean Tremblay</nom>
    <cours sigle="INF8430" note="89" />
    <cours sigle="INF1030" note="69" />
    <cours sigle="INF1230" note="75" /></étudiant>
    <étudiant><nom>Martin Lambert</nom>
    <cours sigle="INF8430" note="75" />
    <cours sigle="INF1030" note="72" />
    <cours sigle="INF1230" note="73" /></étudiant>
    <étudiant><nom>Luc Alain</nom>
    <cours sigle="INF9430" note="39" />
    <cours sigle="INF1030" note="89" />
    <cours sigle="INF1230" note="79" /></étudiant>
    <étudiant><nom>Olive Saint-Amant</nom>
    <cours sigle="INF8430" note="91" />
    <cours sigle="INF1230" note="99" /></étudiant>
    </université>


    Je cherche à obtenir :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <maliste>
    <cours sigle="INF8430">85</cours>
    <cours sigle="INF1030">76.66666666666667</cours>
    <cours sigle="INF1230">81.5</cours>
    <cours sigle="INF9430">39</cours>
    </maliste>


    J’ai notamment essayé ça :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <maliste>
    {for $s in distinct-values(doc("Ex2.xml")//@sigle)
    return
    <cours sigle="$s">
    {avg(for $n in {cours[current()/@sigle=@sigle]/@note}
    return $n)
    }
    </cours>
    }
    </maliste>


    Et ça :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <maliste>
    {for $s in distinct-values(doc("Ex2.xml")//@sigle)
    return
    <cours sigle="$s">
    {avg(for $n in ./@note
    return $n)
    }
    </cours>
    }
    </maliste>



    Bref, après plusieurs tentatives de codes différents, il me semblait que celui-ci était le plus (simple) logique :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <maliste>
    {for $c in doc("Ex2.xml")/universite/etudiant/cours
    return
    <cours sigle="{($c/@sigle)[1]}">
    {avg(for $n in $c/@note
    return $n)
    }
    </cours>
    }
    </maliste>


    Mais, à mon grand désespoir , il ne me retourne que ça :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <?xml version="1.0" encoding="UTF-8"?
    <maliste>
       <cours sigle="INF8430">89</cours>
       <cours sigle="INF1030">69</cours>
       <cours sigle="INF1230">75</cours>
       <cours sigle="INF8430">75</cours>
       <cours sigle="INF1030">72</cours>
       <cours sigle="INF1230">73</cours>
       <cours sigle="INF9430">39</cours>
       <cours sigle="INF1030">89</cours>
       <cours sigle="INF1230">79</cours>
       <cours sigle="INF8430">91</cours>
       <cours sigle="INF1230">99</cours>
    </maliste>


    Quelque chose doit m’échapper, pouvez-vous m’éclairer ?

    Un grand merci d'avance !

    Radu

  2. #2
    Membre émérite
    J’ai notamment essayé ça :
    <maliste>
    {for $s in distinct-values(doc("Ex2.xml")//@sigle)
    return
    <cours sigle="$s">
    {avg(for $n in {cours[current()/@sigle=@sigle]/@note}
    return $n)
    }
    </cours>
    }
    </maliste>
    Regardez bien les différences...
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <maliste>
    {
    for $s in distinct-values(doc("Ex2.xml")//@sigle)
    return
    <cours sigle="{$s}">
    {avg(for $n in doc("Ex2.xml")//cours[@sigle=$s]/@note return $n)}
    </cours>
    }
    </maliste>

  3. #3
    Membre à l'essai
    SUPER ! MERCI tsuji ! :)
    SUPER ! MERCI tsuji !