xQuery distinct-value sum问题

时间:2013-05-13 22:53:29

标签: xquery

我需要总结一下特定产品类别的平均价格,目前我已经设法合并相同的类别类型并计算它们,现在我需要总结来自不同类别的所有价格(目前我选择了所有价格)在我的查询中)

例如:如果有5个A类产品,我需要选择这5个价格并加以总结。

查询

let $hk := doc('http://etutor.dke.uni-linz.ac.at/etutor/XML?id=1')/handelskette/produkte/produkt

for $x in distinct-values($hk/kategorie)
let $c := count($hk[kategorie eq $x])
let $a:= sum($hk/ekPreis)

return <kategorie kname="{$x}">
<anzahl>{$c}</anzahl>
<avgEkPreis>{$a div $c}</avgEkPreis>
</kategorie>

XML

<handelskette>
    <produkte>
        <produkt ean="0-666-4567-2-22">
            <bezeichnung>Autoschampoo</bezeichnung>
            <kategorie>Pflege</kategorie>
            <ekPreis>35</ekPreis>
            <listPreis>69</listPreis>
        </produkt>
        <produkt ean="0-777-4997-2-43">
            <bezeichnung>Glanzpolitur</bezeichnung>
            <kategorie>Pflege</kategorie>
            <ekPreis>70</ekPreis>
            <listPreis>119</listPreis>
        </produkt>
        <produkt ean="1-4444-652-8-88">
            <bezeichnung>CD-Wechsler</bezeichnung>
            <kategorie>Audio</kategorie>
            <ekPreis>2345</ekPreis>
            <listPreis>3999</listPreis>
        </produkt>
    </produkte>  
</handelskette>

我将非常感谢任何帮助

3 个答案:

答案 0 :(得分:1)

只需使用

sum(for $vCat in distinct-values(/*/*/*/kategorie),
        $vCount in count(/*/*/produkt[kategorie eq $vCat])
     return
        sum(/*/*/produkt[kategorie eq $vCat]/ekPreis/xs:double(.)) div $vCount
    )

根据提供的XML文档评估此XPath 2.0表达式(以及XQuery)时:

<handelskette>
    <produkte>
        <produkt ean="0-666-4567-2-22">
            <bezeichnung>Autoschampoo</bezeichnung>
            <kategorie>Pflege</kategorie>
            <ekPreis>35</ekPreis>
            <listPreis>69</listPreis>
        </produkt>
        <produkt ean="0-777-4997-2-43">
            <bezeichnung>Glanzpolitur</bezeichnung>
            <kategorie>Pflege</kategorie>
            <ekPreis>70</ekPreis>
            <listPreis>119</listPreis>
        </produkt>
        <produkt ean="1-4444-652-8-88">
            <bezeichnung>CD-Wechsler</bezeichnung>
            <kategorie>Audio</kategorie>
            <ekPreis>2345</ekPreis>
            <listPreis>3999</listPreis>
        </produkt>
    </produkte>
</handelskette>

生成所需的正确结果(每个类别的平均价格总和):

2397.5

答案 1 :(得分:0)

我没有以正确的方式解释它,我的英语不太好^^。我的意思是我需要每个类别自己总结一下,但多亏了你,我完成了部分你发布的语法。

这是我的查询 - 如果有人有类似的问题:

let $hk := doc('http://etutor.dke.uni-linz.ac.at/etutor/XML?id=1')/handelskette/produkte/produkt

for $x in distinct-values($hk/kategorie)
let $c := count($hk[kategorie eq $x])
let $a:= sum($hk[kategorie eq $x]/ekPreis)

return <kategorie kname="{$x}">
<anzahl>{$c}</anzahl>
<avgEkPreis>{$a div $c}</avgEkPreis>
</kategorie>

非常感谢你,祝你有愉快的一周!

答案 2 :(得分:0)

鉴于您的处理器处理XQuery 3.0,您可能会尝试group by以提高可读性:

for $produkt  in  doc('http://etutor.dke.uni-linz.ac.at/etutor/XML?id=1')/handelskette/produkte/produkt
  group by $kname := $produkt/kategorie
  let $anzahl     := count($produkt)
  let $avg_ek     := sum($produkt/ekPreis) div $anzahl
return
<kategorie kname="{ $kname }">
  <anzahl>{ $anzahl }</anzahl>
  <avgEkPreis>{ $avg_ek }</avgEkPreis>
</kategorie>