2

XQueryを使用して加算を実行しています。データベースに保存されるXMLの構造は次のとおりです。

    <Events>
        <Event>
            <id>1</id>
            <code>1001</code>
            <Amount>50,1</Amount>
        </Event>
        <Event>
            <id>1</id>
            <code>1002</code>
            <Amount>5,5</Amount>
        </Event>
             <Event>
            <id>1</id>
            <code>1001</code>
            <Amount>50,1</Amount>
        </Event>
        <Event>
            <id>1</id>
            <code>1002</code>
            <Amount>5,5</Amount>
        </Event>
    </Events>

XQueryを使用して以下の出力を取得したい:同じコードを持つ金額の合計。注意し,てください.。で置き換え,.算術演算を実行する必要があります。

 <Total>               
            <1001> 100,2 </1001>
            <1002> 11,0 </1002>
   </Total>
4

3 に答える 3

6

XQueryプロセッサがXQuery3.0をサポートしている場合は、group byステートメントを使用します。

<Total>
{
  for $i in //Event
  let $code := $i/code
  group by $code
  return element {"code"} { attribute {"id"} {$code}, sum($i/Amount)}
}
</Total>

あなたの質問のXMLスニペットには2つの違いがあります:浮動小数点セパレーターをポイントに変更しました(これは必須ですが、もちろんいくつかのXQuery文字列操作を使用してこれを行うこともできます)そして要素名は数字だけで構成されていない可能性があります要素の命名規則を見てください。私の例では、代わりにコードをid-attributeとして返すことにしました。

于 2012-05-18T10:34:35.170 に答える
3

これにより、結果セットとしてデータが取得されます。

declare @X xml
set @X = 
'<Events>
        <Event>
            <id>1</id>
            <code>1001</code>
            <Amount>50,1</Amount>
        </Event>
        <Event>
            <id>1</id>
            <code>1002</code>
            <Amount>5,5</Amount>
        </Event>
             <Event>
            <id>1</id>
            <code>1001</code>
            <Amount>50,1</Amount>
        </Event>
        <Event>
            <id>1</id>
            <code>1002</code>
            <Amount>5,5</Amount>
        </Event>
    </Events>'

select T.code,
       sum(Amount) as Amount
from
  (
    select T.X.value('code[1]', 'int') as code,
           cast(replace(T.X.value('Amount[1]', 'varchar(13)'), ',', '.') as float) as Amount
    from @X.nodes('Events/Event') as T(X)
  ) as T
group by T.code
于 2012-05-18T10:30:25.043 に答える
2

次のコードは、合計を計算し、結果をXMLとして出力しますが、出力には含まれません(これは無効です)。

SELECT Code AS 'Code', SUM(Value) AS 'Total'
FROM (
SELECT
    CONVERT(DECIMAL(9,2), REPLACE(c.value('Amount[1]', 'VARCHAR(10)'), ',', '.')) AS Value
    , c.value('code[1]', 'INT') AS Code
FROM @x.nodes('//Event') AS t(c)
) t
GROUP BY Code
FOR XML PATH('Total'), ROOT('Totals')

ここで、@xはデータを含むXML変数です。

于 2012-05-18T10:36:42.510 に答える