【问题标题】:XQuery Average of child element based on different child element基于不同子元素的子元素的 XQuery 平均值
【发布时间】:2014-11-07 20:39:10
【问题描述】:

所以我在让 avg 函数在 XQuery 中按我想要的方式工作时遇到了一些麻烦。我有一个具有 GPA 和分类(大一、大二、大三、大四)的学生的 XML 文件。我想找到每个分类的平均 GPA。我首先得到不同的分类。然后,我得到所有学生的列表,并在学生分类 = 不同分类时选择平均 GPA。这将返回 4 个平均 GPA(我想要的),但它们都是相同的。我已经解决这个小问题好几个小时了,希望能够继续完成我的任务,但这给我带来了太多麻烦。代码如下:

<T> {
   for $dc in distinct-values(doc("ComS363/UniversityDatasets/Student.xml")/Students/Student/Classification)
   let $student := doc("ComS363/UniversityDatasets/Student.xml")/Students/Student
   let $aveGPA := avg($student/GPA)
   where $student/Classification = $dc
   return
   <Classification>{$aveGPA}</Classification>
} </T>;

我的学生表设置如下:

<Students>
  <Student>
    <StudentID>118784412</StudentID>
    <Classification>Sophomore</Classification>
    <GPA>3.19</GPA>
    <MentorID>201586985</MentorID>
    <CreditHours>39</CreditHours>
  </Student>
.
.
.
.
</Students>

那么你们知道为什么我在这里没有获得唯一的平均 GPA 用于分类吗? 提前感谢您的帮助。

【问题讨论】:

    标签: database xquery saxon


    【解决方案1】:

    您的where 子句过滤返回的结果,而不是前面的变量绑定。因此,avg($student/GPA) 将始终评估所有学生的平均 GPA。

    相反,将过滤步骤与变量绑定结合起来:

    let $aveGPA := avg($student[Classification = $dc]/GPA)
    

    为了更好的可读性,您可以将谓词条件应用于$student 变量:

    let $student := doc("ComS363/UniversityDatasets/Student.xml")/Students/Student[Classification = $dc]
    let $aveGPA := avg($student/GPA)
    

    【讨论】:

    • 感谢您的回复。这就说得通了。我现在正在路上,但一旦我回家,我会尝试一下。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多