2012-10-07 124 views
2

我有3个XML文件,如下所示,我希望将所有这3个文档连接在一起,以便我可以执行汇总功能以查明特定分类名称的销售量。但似乎我写的代码有问题。请指导我如何在三个文件上执行汇总功能。分组汇总

ClassDescription.XML 
<classification name="Electronic"> 
    <Description>electronic devices that requires electric</Description> 
</classification> 
<classification name="SoftToy"> 
    <Description>Fluffy toys that kids like</Description> 
</classification> 


ToyClassification.XML 
<toy toyID="11"> 
    <name>Doll</name> 
    <classification>SoftToy</classification> 
</toy> 
<toy toyID="22"> 
    <name>Xbox</name> 
    <classification>Electronic</classification> 
</toy> 
<toy toyID="33"> 
    <name>PS3</name> 
    <classification>Electronic</classification> 
</toy> 


ToySale.XML 
<toySale companyID="1" toyID="11" > 
    <amount>15</amount> 
</toySale> 
<toySale companyID="3" toyID="11" > 
    <amount>12</amount> 
</toySale> 
<toySale companyID="1" toyID="22" > 
    <amount>3</amount> 
</toySale> 
<toySale companyID="2" toyID="33" > 
    <amount>7</amount> 
</toySale> 



<ClassList> 
    <classification name="SoftToy"> 
    <totalSale>4</totalSale> 
    </classification> 
    <classification name="Electronic"> 
    <totalSale>3</totalSale> 
    </classification> 
</ClassList> 

下面是我有的代码,但似乎它不工作。可能我知道什么是正确的xquery这个工作?

for $class in (ClassDescription.XML)//classification/@name 
for $toyClass in (ToyClassification.XML)//toy/@toyID 
for $sale in (ToySale.XML)//toySale/@toyID 
let $sum := (ToySale.XML)//toySale[@toyID = $toyClass] 
where $sale=$toyClass and $class=$toyClass/../name 
order by sum($sum/amount) 
return <ClassList>{$class}</ClassList> 

回答

0

这个查询:

for $total-sale in 
    let $vClasses := doc('file:///c:/temp/delete/classDescription.xml'), 
     $vDetails := doc('file:///c:/temp/delete/toyClassification.xml'), 
     $vSales := doc('file:///c:/temp/delete/toySale.xml') 
    return 
     for $c in $vClasses/*/* 
     return 
      let $d := $vDetails/*/*[classification eq $c/@name], 
       $s := $vSales/*/*[@toyID = $d/@toyID] 
      return 
       <classification name="{$c/@name}"> 
         <totalSale>{sum($s/amount)}</totalSale> 
       </classification> 
    order by $total-sale/totalSale descending 
    return $total-sale 

当三个XML文档驻留在各个文件

C:/temp/delete/classDescription.xml:

<t> 
    <classification name="Electronic"> 
     <Description>electronic devices that requires electric</Description> 
    </classification> 
    <classification name="SoftToy"> 
     <Description>Fluffy toys that kids like</Description> 
    </classification> 
</t> 

c:/temp/delete/toyClassification.xml:

<t> 
    <toy toyID="11"> 
     <name>Doll</name> 
     <classification>SoftToy</classification> 
    </toy> 
    <toy toyID="22"> 
     <name>Xbox</name> 
     <classification>Electronic</classification> 
    </toy> 
    <toy toyID="33"> 
     <name>PS3</name> 
     <classification>Electronic</classification> 
    </toy> 
</t> 

C:/temp/delete/toySale.xml:

<t> 
    <toySale companyID="1" toyID="11" > 
     <amount>15</amount> 
    </toySale> 
    <toySale companyID="3" toyID="11" > 
     <amount>12</amount> 
    </toySale> 
    <toySale companyID="1" toyID="22" > 
     <amount>3</amount> 
    </toySale> 
    <toySale companyID="2" toyID="33" > 
     <amount>7</amount> 
    </toySale> 
</t> 

产生想要的,正确的结果:

<classification name="SoftToy"> 
    <totalSale>27</totalSale> 
</classification> 
<classification name="Electronic"> 
    <totalSale>10</totalSale> 
</classification> 

待办事项,该CompanyID数据ISN”在其他两个表中完全可以使用。

+0

嗨dimitre,已经试过你的查询,是的,它运作良好。再次学习新的东西。谢谢 – setiasetia