XQuery to combine node values with Group By logic
-
24-06-2021 - |
题
I’m looking for an XQuery that will take:
<root>
<entity>
<entityid>1</entityid>
<sometext>this is some text</sometext>
</entity>
<entity>
<entityid>1</entityid>
<sometext>this is some more text</sometext>
</entity>
</root>
And produce a recordset like:
Entityid sometext
1 this is some textthis is some more text
Essentially, combining the values in the 'sometext' nodes while grouping by the entityid. I figured I might be able to accomplish this with loops, but wasn't sure if there was a better way, possibly with a join/group by
解决方案
declare @XML xml =
'<root>
<entity>
<entityid>1</entityid>
<sometext>this is some text</sometext>
</entity>
<entity>
<entityid>1</entityid>
<sometext>this is some more text</sometext>
</entity>
<entity>
<entityid>2</entityid>
<sometext>Another entity</sometext>
</entity>
</root>';
select T.entityid,
@XML.query('/root/entity[entityid = sql:column("T.entityid")]/sometext').value('.', 'nvarchar(max)') as sometext
from (
select distinct T.N.value('entityid[1]', 'int') as entityid
from @XML.nodes('/root/entity') as T(N)
) as T;
Result:
entityid sometext
----------- -----------------------------------------
1 this is some textthis is some more text
2 Another entity
其他提示
You could also do that using a more XQuery-based solution, eg
DECLARE @xml XML = '<root>
<entity>
<entityid>1</entityid>
<sometext>this is some text</sometext>
</entity>
<entity>
<entityid>1</entityid>
<sometext>this is some more text</sometext>
</entity>
<entity>
<entityid>2</entityid>
<sometext>Another entity</sometext>
</entity>
</root>'
select
x.c.value('@entityId', 'int') entityId,
x.c.value('.', 'varchar(max)') someText
from
(
select @xml.query('for $e in distinct-values(root/entity/entityid)
return <m entityId = "{$e}">{data(root/entity[entityid = $e]/sometext)}</m>')
) r(c)
cross apply r.c.nodes('m') x(c)
Thanks to Mikael for xml / extra scenario.
不隶属于 StackOverflow