2017-10-16 187 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