2017-07-20 19 views
4

私はXMLスニペットを含むいくつかの行を扱っています。GROUP BY操作でXMLスニペットを集計する方法

彼らの現在の状態で私の行は次のようになります。私のクエリで

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> 

私はTeamIdによってグループに行を見て、親<Players>要素にそれらのXMLスニペットを集約するため、出力はなりますよこのように:

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> 

どうすればよいですか? 多くの感謝!

答えて

4

ちょうど私はあるとして、指定された要素を挿入するには、この

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; 

別名AS [*]ようにそれをエンジンに指示します試してみてください。この

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

ルート(「プレイヤー」) –

+0

また参加条件は、サブクエリ内で不足している「WHERE X.TeamId = T.TeamId」 –

+0

@KannanKandasamy感謝:)ほぼ正確に正しかった – Chanukya

1

のように試してみました。これにより、余分な名前レベルが回避されます。空のPATH('')は、追加の名前レベルも避けます。

関連する問題