2017-10-16 188 views
-1

我有一个项目的XML清单。XQuery聚合结果并给出总计

库存清单列出了ID为1的物品有多少,ID为2的物品有多少等(认为每个物料ID代表1个产品)。 然而,这个清单是细分的,取决于特定类型的物品的数量有多少特定的标记。 所以,我让我们说:

Item ID Marked? Qty 
1  (no)  500 
1   ABC  100 
1   (no)  50 
1   FFFF 333 
2   (no) 10000 

....

这IR表示在这样的结构:

<Base> 
<Item> 
    <Id>1</Id> 
    <Qty>500</Qty> 
</Item> 
<Item> 
    <Id>1</Id> 
    <Qty>100</Qty> 
    <Mark>ABC</Mark> 
</Item> 
<Item> 
    <Id>1</Id> 
    <Qty>50</Qty> 
</Item> 
<Item> 
    <Id>1</Id> 
    <Qty>333</Qty> 
    <Mark>FFFF</Mark> 
</Item> 
<Item> 
    <Id>2</Id> 
    <Qty>10000</Qty> 
</Item> 
... 
</Base> 

使用XQuery转换我想制作,而不是每个项目ID有多行,每个项目ID有总计行,它将列出每个项目(标记和未标记)的数量总和以及仅标记那些项目数量(具有子标签)的单独总和。我不关心单个标签的内容)。

在什么我想应该是这样表格形式:

Item ID Marked Qty Total Qty 
    1   433   983 
    2   0  10000 
etc. 

在实际的XML格式的转换应该产生这样的:

<Item><Id>1</Id><MarkedQuantity>433</MarkedQuantity><Total>983</Total></Item> 
<Item><Id>2</Id><Total>10000</Total></Item> 
.... 

UPD:编辑的清晰度。

+0

您可能会也可能不会过度复杂,但问题很复杂,因此这位读者不知道您在问什么。降低问题太复杂,不被其他人理解,并且不太可能因此而对他们有用。 –

+0

@ C.M.Sperberg-McQueen谢谢。我补充说明。希望这会更有用。 – Gnudiff

回答

0

事实证明,答案是比较容易的方式(我怀疑):

for $item in //Item 
let $d := $item/Id 
group by $d 
order by $d 
return <Marked id="{$d}" Total="{ sum($item/Qty) }">{ sum($item[Mark]/Qty) }</Marked> 

基本上给出了相同的2把不同的资金用于条款:1与项目总和,另外与过滤项目的总和(那些有Mark标签的人)。

我还是不明白,虽然,我为什么不能用<Id>{ $d }</Id><Marked>{ sum($item[Mark]/Qty) }</Marked><Total>{ sum($item/Qty) }</Total> - 在这种情况下basex发现的抱怨}它想>

但基本上它的工作原理。

2

如果使用

for $item in Base/Item 
group by $id := $item/Id 
order by $id 
return <Item> 
    <Id>{$id}</Id> 
    {for $marked in $item[Mark] 
    group by $mark := $marked/Mark 
    return <Marked name="{$mark}"> 
     {sum($marked/Qty)} 
     </Marked> 
     } 
    <Total>{sum($item/Qty)}</Total> 
</Item> 

你会得到

<Item> 
    <Id>1</Id> 
    <Marked name="ABC">100</Marked> 
    <Total>650</Total> 
</Item> 
<Item> 
    <Id>2</Id> 
    <Total>10000</Total> 
</Item> 

我不太清楚你需要或想要的内部分组,因为我不知道是否有可能成为你想不同的标记区别但希望它给你一个想法。

如果你只是想一共有MarkItem当时的我觉得

for $item in Base/Item 
group by $id := $item/Id 
order by $id 
return <Item> 
    <Id>{$id}</Id> 
    {if ($item[Mark]) 
    then <MarkedQuantity>{sum($item[Mark]/Qty)}</MarkedQuantity> 
    else() 
     } 
    <Total>{sum($item/Qty)}</Total> 
    </Item> 

做到这一点。

+0

谢谢,但不,我需要总数标记的项目,所以我明确希望只获得具有标记标记的项目总数(包含任何内容)。单独列出所有标记的项目是现在正在发生的事情。我自己也找到了一个更简单的解决方案,所以我会发布它。 – Gnudiff