在 XQuery 中重复兄弟节点时对值求和
Sum the values when siblings nodes are repeated in XQuery
我有一系列嵌套节点,我试图在每个 loan
中找到 due_date
节点的重复日期(仅考虑年份和月份),然后对他们的兄弟节点(amount
)。
一个例子解释得更好。
文件payments.xml
:
<loan>
<id>1</id>
<payments>
<local_payment>
<due_date>2012-11-28T08:00:00Z</due_date>
<amount>484</amount>
</local_payment>
<local_payment>
<due_date>2012-12-05T08:00:00Z</due_date>
<amount>450</amount>
</local_payment>
<local_payment>
<due_date>2012-12-12T08:00:00Z</due_date>
<amount>484</amount>
</local_payment>
<local_payment>
<due_date>2012-01-19T08:00:00Z</due_date>
<amount>450</amount>
</local_payment>
<local_payment>
<due_date>2012-01-26T08:00:00Z</due_date>
<amount>450</amount>
</local_payment>
</payments>
</loan>
<loan>
<id>2</id>
<payments>
<local_payment>
<due_date>2013-02-02T08:00:00Z</due_date>
<amount>500</amount>
</local_payment>
<local_payment>
<due_date>2013-02-09T08:00:00Z</due_date>
<amount>500</amount>
</local_payment>
<local_payment>
<due_date>2013-03-16T08:00:00Z</due_date>
<amount>600</amount>
</local_payment>
<local_payment>
<due_date>2013-04-23T08:00:00Z</due_date>
<amount>650</amount>
</local_payment>
</payments>
</loan>
我已经写了一个简单的函数来提取年和月,但我不知道其余的怎么做。
预期输出应该没有每笔贷款的重复日期,并且它们的金额相加。
这是 group by 的 XQuery 3.0 构造的一个很好的示例,所以我假设您的 XQuery 处理器支持 3.0。
你可以根据这样的year/month条件进行分组(有内置函数可以获取dateTime的月份和年份,所以不需要自己写)。然后您可以使用 sum()
.
计算总和
但是,XQuery 是一种查询语言,并不旨在更新现有数据,因此您将不得不重建数据。由于您没有明确指定您希望如何获得结果输出结构,因此我采用了自己的方法 - 根据需要进行调整。
for $loan in /loan
return
<loan>
{ $loan/id }
<payments>{
for $payment in $loan/payments/local_payment
let $year-month := month-from-dateTime($payment/due_date) || year-from-dateTime($payment/due_date)
group by $year-month
return <local_payment>
{ $payment/due_date }
<amount>{ sum($payment/amount) }</amount>
</local_payment>
}</payments></loan>
我有一系列嵌套节点,我试图在每个 loan
中找到 due_date
节点的重复日期(仅考虑年份和月份),然后对他们的兄弟节点(amount
)。
一个例子解释得更好。
文件payments.xml
:
<loan>
<id>1</id>
<payments>
<local_payment>
<due_date>2012-11-28T08:00:00Z</due_date>
<amount>484</amount>
</local_payment>
<local_payment>
<due_date>2012-12-05T08:00:00Z</due_date>
<amount>450</amount>
</local_payment>
<local_payment>
<due_date>2012-12-12T08:00:00Z</due_date>
<amount>484</amount>
</local_payment>
<local_payment>
<due_date>2012-01-19T08:00:00Z</due_date>
<amount>450</amount>
</local_payment>
<local_payment>
<due_date>2012-01-26T08:00:00Z</due_date>
<amount>450</amount>
</local_payment>
</payments>
</loan>
<loan>
<id>2</id>
<payments>
<local_payment>
<due_date>2013-02-02T08:00:00Z</due_date>
<amount>500</amount>
</local_payment>
<local_payment>
<due_date>2013-02-09T08:00:00Z</due_date>
<amount>500</amount>
</local_payment>
<local_payment>
<due_date>2013-03-16T08:00:00Z</due_date>
<amount>600</amount>
</local_payment>
<local_payment>
<due_date>2013-04-23T08:00:00Z</due_date>
<amount>650</amount>
</local_payment>
</payments>
</loan>
我已经写了一个简单的函数来提取年和月,但我不知道其余的怎么做。 预期输出应该没有每笔贷款的重复日期,并且它们的金额相加。
这是 group by 的 XQuery 3.0 构造的一个很好的示例,所以我假设您的 XQuery 处理器支持 3.0。
你可以根据这样的year/month条件进行分组(有内置函数可以获取dateTime的月份和年份,所以不需要自己写)。然后您可以使用 sum()
.
但是,XQuery 是一种查询语言,并不旨在更新现有数据,因此您将不得不重建数据。由于您没有明确指定您希望如何获得结果输出结构,因此我采用了自己的方法 - 根据需要进行调整。
for $loan in /loan
return
<loan>
{ $loan/id }
<payments>{
for $payment in $loan/payments/local_payment
let $year-month := month-from-dateTime($payment/due_date) || year-from-dateTime($payment/due_date)
group by $year-month
return <local_payment>
{ $payment/due_date }
<amount>{ sum($payment/amount) }</amount>
</local_payment>
}</payments></loan>