Я пытаюсь извлечь количество взрослых, детей и младенцев из приведенного ниже примера 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