值四舍五入后的 Xquery SUM
Xquery SUM after value has been rounded
我想在四舍五入后将所有products/Product/Quantity的数量相加。
我的 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 sum 和 round 函数,但这只会对 Quantity 的第一个实例进行舍入和求和(即 sum(round(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
您可以尝试使用 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
您可以使用 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)
我想在四舍五入后将所有products/Product/Quantity的数量相加。
我的 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 sum 和 round 函数,但这只会对 Quantity 的第一个实例进行舍入和求和(即 sum(round(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
您可以尝试使用 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
您可以使用 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)