Xquery 计算平均数的平均数

Xquery 计算平均数的平均数,xquery,Xquery,我有一个很大的XML文件,其中包含一家连锁酒店的数据。每周、每天、每家酒店,他们都会为报告保留一些数据: <Report week="1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="report.xsd"> <Days> <Day id="1" naam="Monday">

我有一个很大的XML文件,其中包含一家连锁酒店的数据。每周、每天、每家酒店,他们都会为报告保留一些数据:

    <Report week="1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="report.xsd">
        <Days>
            <Day id="1" naam="Monday">
                <Hotels>
                    <Hotel id="1" naam="Bonotel Antwerp">
                        <Stays>
                            <Stay id="1">
                                <Room id="1" number="1"/>
                                <Roomtype id="1" naam="oneperson" price="20.00"/>
                                <Period id="1" naam="lowseason" price="20.00"/>
                                <Formula id="1" naam="roomandbreakfast" price="20.00"/>
                                <Facilities>
                                    <Facility id="1" naam="swimming" price="5.00"/>
                                    <Facility id="2" naam="golf" price="20.00"/>
                                </Facilities>
                                <Guest id="1" naam="John Williams"/>
                            </Stay>
                            <Stay id="2">
                                <Room id="2" number="2"/>
                                <Roomtype id="1" naam="oneperson" price="20.00"/>
                                <Period id="1" naam="lowseason" price="20.00"/>
                                <Formula id="1" naam="roomandbreakfast" price="20.00"/>
                                <Facilities>
                                    <Facility id="2" naam="golf" price="20.00"/>
                                    <Facility id="3" naam="minibar" price="10.00"/>
                                </Facilities>
                                <Guest id="2" naam="Ray Kurzweil"/>
                            </Stay>
                            <Stay id="3">
                                <Room id="3" number="3"/>
                                <Roomtype id="2" naam="twoperson" price="40.00"/>
                                <Period id="1" naam="lowseason" price="20.00"/>
                                <Formula id="2" naam="halfpension" price="30.00"/>
                                <Facilities>
                                    <Facility id="4" naam="tennis" price="20.00"/>
                                    <Facility id="4" naam="tennis" price="20.00"/>
                                </Facilities>
                                <Guest id="3" naam="Stephen Hawking"/>
                            </Stay>
                        </Stays>
                    </Hotel>
(: ... Other Hotels ... :)
                </Hotels>
            </Day>
(: ... Other Days ... :)
        </Days>
    </Report>

(:…其他酒店…:)
(:…其他天…:)
使用XQuery,我必须计算客人的平均花费。这是房间类型价格、周期价格、公式价格和设施的总和。我提出了这个XQuery:

xquery version "1.0";
<ReportResult week="1">
{
    for $x in (1 to 7)
    return
        for $stays in doc("report.xml")//Report/Days/Day[@id=$x]/Hotels/Hotel[@id=1]/Stays
        let $average := avg(
            for $v in $stays/Stay
                return sum($v/Roomtype/@price) + sum($v/Facilities/Facility/@prijs) + sum($v/Formula/@price) + sum($v/Period/@price)
        )           
        return
        <AverageSpending hotel="Bonotel Antwerpen" day="{data($x)}">
            {data(round-half-to-even($average, 2))}     
        </AverageSpending>
    }
</Reportresult>
xquery版本“1.0”;
{
在(1到7)中的x美元
返回
对于doc中的$stays(“report.xml”)//report/Days/Day[@id=$x]/Hotels/Hotel[@id=1]/stays
让$average:=平均值(
以$v的形式入住/入住
返回金额($v/Roomtype/@price)+金额($v/Facility/Facility/@prijs)+金额($v/Formula/@price)+金额($v/Period/@price)
)           
返回
{数据(四舍五入到偶数($average,2))}
}
这将产生我预期的结果:

<Reportresult week="1">
    <Averagespending hotel="Bonotel Antwerpen" day="1">101.67</AverageSpending>
    <Averagespending hotel="Bonotel Antwerpen" day="2">321.67</AverageSpending>
    (: ... etc... :)
    <Averagespending hotel="Bonotel Antwerpen" day="2">255</AverageSpending>
</Reportresult>

101.67
321.67
(:…等…:)
255
不过,我也想计算一下总平均数。所有平均值之和除以7天,得到如下结果

<TotalAverage>198,67</TotalAverage>
198,67

但我在计算总平均数时遇到了麻烦。在Java中,我会使用一个total变量,并用计算出的每个循环的平均值来递增它,但显然这在这里不起作用。如何使用XQuery实现这一点?谢谢。

通过示例,您可以将请求的第一部分分配给变量,并计算其总平均值,然后计算两个结果:

xquery version "1.0";
<ReportResult week="1">
{ let $averages := 
 for $x in (1 to 7)
 return
    for $stays in doc("report.xml")//Report/Days/Day[@id=$x]/Hotels/Hotel[@id=1]/Stays
    let $average := avg(
        for $v in $stays/Stay
            return sum($v/Roomtype/@price) + sum($v/Facilities/Facility/@prijs) + sum($v/Formula/@price) + sum($v/Period/@price)
    )           
    return
    <AverageSpending hotel="Bonotel Antwerpen" day="{data($x)}">
        {data(round-half-to-even($average, 2))}     
    </AverageSpending>
return ($averages,<TotalAverage>{avg($averages)}</TotalAverage>)
</Reportresult>
xquery版本“1.0”;
{让$averages:=
在(1到7)中的x美元
返回
对于doc中的$stays(“report.xml”)//report/Days/Day[@id=$x]/Hotels/Hotel[@id=1]/stays
让$average:=平均值(
以$v的形式入住/入住
返回金额($v/Roomtype/@price)+金额($v/Facility/Facility/@prijs)+金额($v/Formula/@price)+金额($v/Period/@price)
)           
返回
{数据(四舍五入到偶数($average,2))}
返回($averages,{avg($averages)})

请给我们一些示例数据以供使用和/或提供一些不需要数据的抽象示例。太棒了!非常感谢。