【问题标题】:Sum using XQuery使用 XQuery 求和
【发布时间】:2012-05-25 21:52:28
【问题描述】:

我正在使用 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>

【问题讨论】:

  • 您真的需要代码值作为节点名称吗?您能否考虑将代码作为节点值或属性值的输出 XML 的另一种结构?
  • 在您的输出中,您不能有以数字开头的限定名称。它们应该以字母或下划线开头。
  • 嗨 Mikael,我也可以使用 A1001。但我需要代码值作为节点名称。

标签: xquery xquery-sql


【解决方案1】:

如果您的 XQuery 处理器支持 XQuery 3.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 sn-ps 有两个不同之处:我将浮点分隔符更改为点(这是必需的,当然您也可以使用一些 XQuery 字符串操作来执行此操作)并且元素名称可能不包含仅限数字,请查看element naming rules。在我的示例中,我决定将代码作为 id-attribute 返回。

【讨论】:

  • 嗨拉农,我想将 , 替换为 .并做加法,你能帮我解决这个问题吗,我正在尝试使用替换功能,但它给了我错误“SQL16003N 数据类型的表达式“(item(),item()+)”不能在以下情况下使用上下文中需要数据类型“item()”。错误 QName=err:XPTY0004。"
  • 感谢您在询问之前尝试自己。 :) 您可能在返回行中使用了replace(...)。 Replace 需要一个字符串,而不是一堆字符串。将此行添加到 let 语句:let $amount := number(replace($i/Amount, ",", "."))。这用点替换冒号并转换为数字。在sum(...) 中,求和$amount
  • 您可以在zorba-xquery.com/html/demo#4yAN48cPJqRgjJvmSlBOzdEe0hk= 现场试用解决方案的编辑版本,它似乎工作正常。
  • 谢谢拉农,我已经添加了 let 语句,但它给出了同样的错误。 :(。你能指导一下吗?
【解决方案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 变量。

【讨论】:

    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-09
      相关资源
      最近更新 更多