Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 xml query сумма значений атрибутов  [new]
anpv
Member

Откуда: Novosibirsk
Сообщений: 68
Доброго времени суток.
Допустим есть такой xml:
declare @xml xml;
set @xml = '<root>
  <item f1="1" f2="3" />
  <item f1="2" />
  <item f2="4" f3="5" />
  <item f3="6" />
</root>';
select @xml.query('...')
Подкажите запрос XQuery чтобы получить следующий xml:
<root>
  <item f1="3" />
  <item f2="7" />
  <item f3="11" />
</root>
Т.е. нужно просуммировать соответствующие атрибуты.
28 май 09, 14:34    [7239808]     Ответить | Цитировать Сообщить модератору
 Re: xml query сумма значений атрибутов  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

предполагается, что имена атрибутов заранее неизвестны?

Posted via ActualForum NNTP Server 1.4

28 май 09, 15:13    [7240178]     Ответить | Цитировать Сообщить модератору
 Re: xml query сумма значений атрибутов  [new]
anpv
Member

Откуда: Novosibirsk
Сообщений: 68
daw,

Имена атрибутов извесны, и находятся в другом xml:
set @xml = '<root>
  <item name="f1" />
  <item name="f2" />
  <item name="f3" />
</root>';
28 май 09, 15:18    [7240223]     Ответить | Цитировать Сообщить модератору
 Re: xml query сумма значений атрибутов  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

> Имена атрибутов извесны, и находятся в другом xml:
>
> set @xml ='<root>
> <item name="f1" />
> <item name="f2" />
> <item name="f3" />
> </root>';

я имею в виду, в запрос имена жестко зашивать нельзя?
если да, то такое не устроит:
<root>
   <item name="f1" value="3"/>
   <item name="f2" value="7"/>
   <item name="f3" value="11"/>
</root>
?

Posted via ActualForum NNTP Server 1.4

28 май 09, 15:32    [7240345]     Ответить | Цитировать Сообщить модератору
 Re: xml query сумма значений атрибутов  [new]
anpv
Member

Откуда: Novosibirsk
Сообщений: 68
daw,

Да, устроит.
28 май 09, 15:41    [7240407]     Ответить | Цитировать Сообщить модератору
 Re: xml query сумма значений атрибутов  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

> Да, устроит.

как-то так можно:
;with cte(c) as (select @xml c)
, cte2 as
(
select
   t2.c.value('local-name(.)', 'nvarchar(max)') name
   , t2.c.value('.', 'int') value
from cte
   cross apply cte.c.nodes('/root/item/@*') t2(c)
)
select name, sum(value) value
from cte2 as item
group by name
for xml auto, root('root')

Posted via ActualForum NNTP Server 1.4

28 май 09, 15:47    [7240447]     Ответить | Цитировать Сообщить модератору
 Re: xml query сумма значений атрибутов  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

или так - чистым xquery
select @xml.query('<root>{
                    for $s2 in distinct-values(for $s in (/root/item/@*) return local-name($s))
                    order by $s2
                    return <item name="{$s2}" value="{sum(/root/item/@*[local-name(.)=$s2])}"/>
                    }</root>
                   ')


Posted via ActualForum NNTP Server 1.4

28 май 09, 16:17    [7240725]     Ответить | Цитировать Сообщить модератору
 Re: xml query сумма значений атрибутов  [new]
anpv
Member

Откуда: Novosibirsk
Сообщений: 68
daw,

Спасибо.
У меня не получался вариант с XQuery, я пытался динамически сгенерировать имя атрибута. Но похоже MS SQL этого не позволяет.
28 май 09, 16:30    [7240832]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить