2017-07-20 1 views
4

Ich arbeite mit einigen Zeilen, die XML-Snippets enthalten.So aggregieren Sie XML-Snippets in der GROUP BY-Operation

Meine Zeilen in ihrem aktuellen Zustand wie folgt aussehen:

TeamId  Player 
---------------------------------------------------------------------------- 
1 | <Player><FirstName>Bob</FirstName><LastName>Smith</LastName></Player> 
1 | <Player><FirstName>Sam</FirstName><LastName>Jones</LastName></Player> 
2 | <Player><FirstName>David</FirstName><LastName>White</LastName></Player> 
2 | <Player><FirstName>James</FirstName><LastName>Black</LastName></Player> 

Mit meiner Abfrage die Zeilen von TeamId und aggregieren diese XML-Schnipsel in eine übergeordnete <Players> Element, so dass die Ausgabe aussehen Gruppe werde ich bin auf der Suche wie folgt:

1 | <Players> 
     <Player><FirstName>Bob</FirstName><LastName>Smith</LastName></Player> 
     <Player><FirstName>Sam</FirstName><LastName>Jones</LastName></Player> 
     </Players> 
2 | <Players> 
     <Player><FirstName>David</FirstName><LastName>White</LastName></Player> 
     <Player><FirstName>James</FirstName><LastName>Black</LastName></Player> 
     </Players> 

Wie soll ich das machen? Vielen Dank!

Antwort

4

Gerade habe ich versucht, wie diese

CREATE TABLE #A 
    (
    TEAMID INT, 
    PLAYER XML 
    ) 
    INSERT INTO #A VALUES 
    (1,'<PLAYER><FIRSTNAME>BOB</FIRSTNAME><LASTNAME>SMITH</LASTNAME></PLAYER>'), 
    (1,'<PLAYER><FIRSTNAME>SAM</FIRSTNAME><LASTNAME>JONES</LASTNAME></PLAYER>'), 
    (2,'<PLAYER><FIRSTNAME>DAVID</FIRSTNAME><LASTNAME>WHITE</LASTNAME></PLAYER>'), 
    (2,'<PLAYER><FIRSTNAME>JAMES</FIRSTNAME><LASTNAME>BLACK</LASTNAME></PLAYER>') 


SELECT T.TEAMID, 
     ( SELECT TEAMID , 
        PLAYER 
      FROM #A AS X 
      WHERE X.TeamId = T.TeamId 
      FOR XML PATH('PLAYER'), TYPE, ROOT('PLAYERS') 

     ) AS XML_FORMAT_STRING 
FROM #A AS T 
GROUP BY T.TEAMID; 
+0

Root ('Spieler') –

+0

Auch Joinbedingung innerhalb subquery fehlt 'WHERE X.TeamId = T.TeamId' –

+0

@KannanKandasamy Thanks :) – Chanukya

1

Probieren Sie es wie dieses

SELECT tbl.TeamId, 
     ( SELECT Player AS [*] 
      FROM YourTable AS X 
      WHERE X.TeamId = tbl.TeamId 
      FOR XML PATH(''), TYPE, ROOT('Players') 
     ) AS [*] 
FROM YourTable AS tbl 
GROUP BY tbl.TeamId; 

Die alias AS [*] den Motor teilt das gegebene Element einfügen wie sie ist. Dies vermeidet zusätzliche Namensebenen. Die leere PATH('') vermeidet auch eine zusätzliche Namensebene.

Verwandte Themen