Суммирование значения XML на основе различных типов атрибутов - PullRequest
0 голосов
/ 25 сентября 2018

Я пытаюсь извлечь количество взрослых, детей и младенцев из приведенного ниже примера XML:

  • Adults = AgeType 3
  • Children = AgeType 2
  • Infants = AgeType 1

, а затем количество указывает, сколько из этого типа возраста.Правильный результат:

  • 35 Взрослых
  • 5 Детей
  • 2 Младенцев

Приведенный ниже код возвращает правильный результат, однако яХотелось бы избежать ввода cross apply в теги <Customer> (так как их сотни миллионов в день).

declare @a table(a xml)
insert into @a  
select '<Customers>
        <Customer AgeType="3" Count="10" />    
        <Customer AgeType="3" Count="20" />
        <Customer AgeType="3" Count="5" />       
        <Customer AgeType="2" Count="5" />
        <Customer AgeType="1" Count="2" />
        </Customers>'

select  
    sum(case when b.cust = 3 then b.cust*b.count_cust end)/3 as adt
    ,sum(case when b.cust = 2 then b.cust*b.count_cust end)/2 as chd
    ,sum(case when b.cust = 1 then b.cust*b.count_cust end)/1 as inf
from   (
select c.value('(@AgeType)','int') As cust
,c.value('(@Count)','int') As count_cust
from @a cross apply a.nodes('Customers/Customer') as t(c)
) as b

Может ли кто-нибудь найти какую-либо другую логику, которая могла бы быть более эффективной?Я думал об использовании count или sum над тегами <Customer>, как показано ниже, однако я не могу получить правильные результаты.

 a.value('count(Customers/Customer/@AgeType[.=3])','int') As adt
,a.value('count(Customers/Customer/@AgeType[.=2])','int') As chd
,a.value('count(Customers/Customer/@AgeType[.=1])','int') As inf

1 Ответ

0 голосов
/ 25 сентября 2018

Измените ваш XPath с

count(Customers/Customer/@AgeType[.=3])

на

sum(Customers/Customer[@AgeType = 3]/@Count)

, чтобы суммировать все значения атрибута для взрослых (@AgeType = 3) Customer @Count.

Следуйте той же схеме для других возрастных типов.

...