2011-02-28 5 views
3

次の構造にXPathの合計を書き込むにはどうすればよいですか?サブストラクチャのXPathの合計

<Order> 
    <Details> 
     <Detail> 
      <Quantity>10</Quantity> 
      <ItemPrice>20</Quantity> 
     </Detail> 
     <Detail> 
      <Quantity>10</Quantity> 
      <ItemPrice>20</Quantity> 
     </Detail> 
    </Details> 
</Order> 

私はこれを行うことができます(数量* itemprice)

の合計を取得したい:

select * 
from mytable 
where documentdata.exist('/Order[sum(/Details/Detail/Quantity) > 20]) = 1 

しかし、私は数量を使用したい* ItemPriceが、私は、構文を理解カントそれのために...

+0

あなたは、XPath 1.0を使用している場合、私は[この質問](HTTPでの情報で行く、あなたは運の出ている疑いがあります:/ /stackoverflow.com/questions/436998/multiply-2-numbers-and-then-sum-with-xslt)(これは普通のxpathではなくxsltであり、正確な複製ではありません)。 – AakashM

+0

私はSql Server 2008でXML列を使用しています。mytable.exists(xpath)= 1を使用してクエリを実行しています。XPath sqlサーバーのバージョンはどちらでもありません –

+0

残念ながらxpath 2.0をサポートするMicrosoft製品。 – AakashM

答えて

4

てみ

select * 
from mytable 
where documentdata.exist('/Order[sum(for $d in Details/Detail return $d/Quantity * $d/ItemPrice) > 20]) = 1 

これは適切なXQuery構文であり、XQueryのサポートが限られているため、MS SQL Serverで動作する可能性があります。

私はあなたがこのXPath 2.0の表現したいと思います
+0

これはトリックでした: - D –

+0

私はこれをLinqからSqlXmlフレームワークに実装しました:http://rogeralsing.com/2011/02/28/linq-to-sqlxml/ –

1

:このXPath 2.0の(ともXQueryの)式が提供されるXML文書に対してを評価する際

/*/*/sum(Detail/(Quantity * ItemPrice)) 

/Order[sum(Details/Detail/(Quantity * ItemPrice)) gt 20] 
1

使用を所望の正しい結果が生成されます。

400 

ので、完全なSQLクエリは次のようになります。

select * from mytable 
    where documentdata.exist 
    ('/*[sum(*/Detail/(Quantity * ItemPrice)) > 20]') = 1 
関連する問題