2016-02-08 57 views
2

我想在舍入值之後對所有產品/產品/數量的數量進行求和。經過舍入後的Xquery SUM

我的XML看起來像:

<Products> 
    <Product> 
    <ExternalId>116511</ExternalId> 
    <Price>2.99 </Price> 
    <Quantity>1.500 </Quantity> 
    <NetValue>4.08 </NetValue> 
    </Product> 
    <Product> 
    <ExternalId>116510</ExternalId> 
    <Price>2.99 </Price> 
    <Quantity>1.500 </Quantity> 
    <NetValue>4.08 </NetValue> 
    </Product> 
    <Product> 
    <ExternalId>116512</ExternalId> 
    <Price>1.99 </Price> 
    <Quantity>10.000 </Quantity> 
    <NetValue>18.09 </NetValue> 
    </Product> 
    <Product> 
    <ExternalId>329245</ExternalId> 
    <Price>59.99 </Price> 
    <Quantity>1.000 </Quantity> 
    <NetValue>54.53 </NetValue> 
    </Product> 
</Products> 

上述XML存儲在X與數據的列。

我已經使用XQuery和與圓的功能,像這樣但這只是一個輪嘗試,總結數量的第一個實例(即總和(圓(1.5))= 2):

SELECT Data.Value('(Products/Product/ExternalId/text()[1]', 'float') AS ExternalId, 
x.Data.value('sum(round((/row/Products[1]/Product/Quantity)[1]))', 'float') Trn_Quantity 
FROM x 
+0

不知道我明白你的查詢試圖做什麼。你想要_first_ ExternalId和_all_數量的總和? –

回答

2

你可以試試使用XQuery for循環結構圓個人Quantity並傳遞給sum(),這樣的事情:

SELECT 
    Data.Value('(Products/Product/ExternalId/text()[1]) AS ExternalId, 
    x.Data.value(' 
     sum(
      for $quantity in /Products[1]/Product/Quantity 
      return round($quantity) 
     ) 
    ', 'float') Trn_Quantity 
FROM x 

快速測試此:http://sqlfiddle.com/#!3/9eecb7/7351

+0

感謝har07,完美的作品。不知道你可以在xQuery中使用循環。你每天學習新的東西。 – user2034250

1

您可以使用CROSS APPLY來獲取所有數量的節點,然後只需使用常規SQL進行求和;

SELECT SUM(ROUND(p.value('.', 'float'), 0)) AS Quantity 
FROM mytable x 
CROSS APPLY data.nodes('/Products/Product/Quantity') t(p) 

...或者,也可以對其他產品字段進行求和,得到交叉應用的產品節點並按名稱求和子節點;

SELECT SUM(p.value('(./Price)[1]', 'float')) AS Price, 
     SUM(ROUND(p.value('(./Quantity)[1]', 'float'), 0)) AS Quantity 
FROM mytable x 
CROSS APPLY data.nodes('/Products/Product') t(p)