Xquery中的分组依据和计数

时间:2013-12-10 00:11:14

标签: xml xquery marklogic

我正在尝试计算类似的'itemid_ref',以获取每个项目的数量参考:

<?xml version="1.0" encoding="utf-8"?>
<electrystore>
  <itembill>
   <itembill_id>1</itembill_id>
   <itemid_ref>2</itemid_ref>
   <billid_ref>2</billid_ref>
   <price>20000</price> 
  </itembill>
   <itembill>
   <itembill_id>2</itembill_id>
   <itemid_ref>3</itemid_ref>
   <billid_ref>3</billid_ref>
   <price>250000</price> 
  </itembill>
  <itembill>
   <itembill_id>3</itembill_id>
   <itemid_ref>3</itemid_ref>
   <billid_ref>3</billid_ref>
   <price>30000</price> 
  </itembill>
  <itembill>
   <itembill_id>4</itembill_id>
   <itemid_ref>1</itemid_ref>
   <billid_ref>2</billid_ref>
   <price>140000</price> 
  </itembill>
  <itembill>
   <itembill_id>5</itembill_id>
   <itemid_ref>2</itemid_ref>
   <billid_ref>1</billid_ref>
   <price>10000</price> 
  </itembill>
</electrystore>

我试图让xquery的输出像这样:

<?xml version="1.0" encoding="UTF-8"?>
<results>
<result>
    <itemid_ref>
       2
    </itemid_ref>
    <numberOfitemes>2</numberOfitemes>
</result>
<result>
    <itemid_ref>
       3
    </itemid_ref>
    <numberOfitemes>2</numberOfitemes>
</result>
<result>
   <itemid_ref>
       1
    </itemid_ref>
    <numberOfitemes>1</numberOfitemes>
</result>

我该怎么做?

1 个答案:

答案 0 :(得分:4)

XQuery 1.0中没有group by,但通常只要数据集不是太大就可以使用distinct-values

for $itemid_ref in distinct-values(/electrystore/itembill/itemid_ref)
let $count := count(/electrystore/itembill[itemid_ref = $itemid_ref])
return element result {
  element itemid_ref { $itemid_ref },
  element numberOfitemes { $count }
}

要了解大型数据集,您可能需要查看XQuery处理器中允许访问索引的扩展。

在XQuery 3.0中,它有点简单:

for $itembill in /electrystore/itembill
let $itemid_ref := $itembill/itemid_ref
group by $itemid_ref
return element result {
  element itemid_ref { $itemid_ref },
  element numberOfitemes { count($itembill) }
}