2017-05-04 1 views
1

Xquery에서 연습 문제가 있습니다. for 루프를 Xquery에 추가하려면 어떻게합니까?

모든 교사가 한 달에 이름이 그 과정의 모든 장소가 완료된 경우 마이클 시작 (모든의 합)를 얻을 것이다 무엇을 얻을 :

는 운동이다.

그리고 이것은 XML 파일 : 나는이 작업을 수행하려고

<shop> 
<training> 
    <course id="1"> 
     <name>Java</name> 
     <price fee="Monthly">27</price> 
     <places>20</places> 
     <teacher>Michael James</teacher> 
    </course> 
    <course id="2"> 
     <name>Android</name> 
     <price fee="Monthly">47</price> 
     <places>15</places> 
     <teacher>Michael Pit</teacher> 
    </course> 
    <course id="3"> 
     <name>SEO</name> 
     <price fee="Monthly">37</price> 
     <places>55</places> 
     <teacher>Michael Smith</teacher> 
    </course> 
    <course id="4"> 
     <name>HTML</name> 
     <price fee="Monthly">99</price> 
     <places>10</places> 
     <teacher>Michael Kit</teacher> 
    </course> 
    <course id="5"> 
     <name>CSS</name> 
     <price fee="Monthly">749</price> 
     <places>5</places> 
     <teacher>George Pet</teacher> 
    </course> 

는 :

<courses> 
<michael_profits>540</michael_profits> 
</courses> 
<courses> 
<michael_profits>705</michael_profits> 
</courses> 
<courses> 
<michael_profits>2035</michael_profits> 
</courses> 
<courses> 
<michael_profits>990</michael_profits> 
</courses> 

그것을 :

` for $x in doc("LM")//course[starts-with(teacher, "Michael")] 
let $monthly-profits-by-course := $y/places * $y/price 
let $total-profits := sum($monthly-profits-by-course) 
return 
<courses> 
    <michael_profits>{$total-profits}</michael_profits> 
</courses>` 

다음은 결과입니다 명부 물론 월간 수익은 물론이지만 총 이익이 필요하고 어떻게 할 수 있는지 알지 못합니다. 나는 "for"대신에 "let"만을 사용하여 그것을 시도했지만, 이것은 가격으로 장소를 배가시키는 것을 허용하지 않는다. 이유를 알지 못한다. 누군가 내가 도와 줄 수 있니? 대단히 고마워.

+0

이미 시도한 코드를 포함하십시오. 또한 http://stackoverflow.com/help/how-to-ask의 다른 조언을 따르십시오. – BPS

답변

2

귀하의 $monthly-profits-by-course은 항상 하나의 값이 될 것이고, 각 과정을 반복 할 때 시퀀스가 ​​아닙니다. 따라서 sum($monthly-profits-by-course)$monthly-profits-by-course 그 자체가됩니다. 당신이 원하는 것은 이미했던 것처럼 각 선생님이 이익의 순서를 반환하는 것입니다 : 그리고이 모든 값의 합계를 계산합니다. 결합,이과 같습니다

let $all-sums := 
    for $x in doc("LM")//course[starts-with(teacher, "Michael")] 
    return $y/places * $y/price 
return sum($all-sums) 

그리고 당신은 단순히이 단축 될 수 있습니다 : 당신이지도 ! 연산자를 사용하고 쓸 수는 XQuery 3.0

sum(
    for $x in doc("LM")//course[starts-with(teacher, "Michael")] 
    return $y/places * $y/price 
) 

그리고 당신는 XQuery 프로세스 (processor)가 지원하는 경우 :

sum(doc("LM")//course[starts-with(teacher, "Michael")] ! (./places * ./price)) 
+0

완벽하게 작동합니다. 고마워요! – user7753413

관련 문제