2010-11-29 8 views
0

Situation: Cette table contient les informations de relation entre une table Documents et une table Utilisateurs. Certains utilisateurs doivent examiner ou approuver des documents (type). Je voudrais l'avoir où je pourrais avoir tous les commentaires sur une seule ligne si nécessaire. Donc, si trois utilisateurs Examen des documents 1, puis une rangée aurait 346, 394, 519 comme la valeur, puisque ce sont les examinateursRequête SQL Server avec plusieurs valeurs dans une colonne relative à une autre colonne

Tableau: xDocumentsUsers

DocID..UserID....Type... 
1........386......approver 
1........346......reviewer 
1........394......reviewer.. 
1........519......reviewer.. 
4........408......reviewer.. 
5........408......reviewer.. 
6........408......reviewer.. 
7........386......approver.. 
7........111......readdone.. 
7........346......reviewer.. 
8........386......approver.. 
8........346......reviewer.. 
9........386......approver.. 
9........346......reviewer.. 
10.......386......approver.. 
11.......386......approver.. 
11......346......reviewer.. 
12......386......approver.. 
12......346......reviewer.. 
13......386......approver.. 
13......346......reviewer.. 
14......386......approver.. 
14......346......reviewer.. 
15......386......approver 

donc résultat souhaité serait .. .

DocID..UserID ................ type ...

1........386....................approver 
1........346,394,519......reviewer. 
4........408....................reviewer.. 
5........408....................reviewer.. 
6........408....................reviewer.. 
7........386....................approver.. 
7........111....................readdone.. 
7........346....................reviewer.. 
8........386....................approver.. 
8........346....................reviewer.. 
9........386....................approver.. 
9........346....................reviewer.. 
10......386....................approver.. 
11......386....................approver.. 
11......346....................reviewer.. 
12......386....................approver.. 
12......346....................reviewer.. 
13......386....................approver.. 
13......346....................reviewer.. 
14......386....................approver.. 
14......346....................reviewer.. 
15......386....................approver 
+0

DECLARE @UsersID varchar (100) SELECT @UsersID = COALESCE (@ UsersID + ',', '') + CAST (ID utilisateur AS varchar (5)) FROM xDocumentsUsers WHERE DocumentID = 1 SELECT @UsersID ...................... ....................... Obtient-moi ce résultat: 386, 346, 394, 519 – sjpizzle

Répondre

1

Have un regard sur

Emulating MySQL’s GROUP_CONCAT() Function in SQL Server 2005

Is there a way to create a SQL Server function to “join” multiple rows from a subquery into a single delimited field?

Un exemple simple est

DECLARE @Table TABLE(
     ID INT, 
     Val VARCHAR(50) 
) 
INSERT INTO @Table (ID,Val) SELECT 1, 'A' 
INSERT INTO @Table (ID,Val) SELECT 1, 'B' 
INSERT INTO @Table (ID,Val) SELECT 1, 'C' 
INSERT INTO @Table (ID,Val) SELECT 2, 'B' 
INSERT INTO @Table (ID,Val) SELECT 2, 'C' 

--Concat 
SELECT t.ID, 
     (
      SELECT tIn.Val + ',' 
      FROM @Table tIn 
      WHERE tIn.ID = t.ID 
      FOR XML PATH('') 
     ) 
FROM @Table t 
GROUP BY t.ID 
+0

J'aime la façon dont cet exemple fonctionne, si la table existe déjà cela signifie que je pourrais juste utiliser ce qui est après --Concat? – sjpizzle

+0

Oui, c'est vrai.Ceci est juste un exemple, en utilisant une variable de table –

0

cette aide?

SELECT DocID 
    , [Type] 
    , (SELECT CAST(UserID + ', ' AS VARCHAR(MAX)) 
     FROM [xDocumentsUsers] 
     WHERE (UserID = x1.UserID) 
     FOR XML PATH ('') 
    ) AS [UserIDs] 
FROM [xDocumentsUsers] AS x1 
+0

------------------ --------- Microsoft SQL Server Management Studio -------- ------------------- Erreur d'exécution SQL. Instruction SQL exécutée: SELECT DocumentID, [Type], (SELECT CAST (ID utilisateur + ',' AS VARCHAR (MAX)) FROM [xDocumentsUsers] WHERE (ID_utilisateur = x1.UserID) POUR CHEMIN XML ('')) AS [ UserIDs] FROM [xDocumentsUsers] AS x1 Source de l'erreur: Fournisseur de données SqlClient .Net Message d'erreur: La conversion a échoué lors de la conversion de la valeur varchar ',' en type de données int. Aide ------------------ --------- – sjpizzle

2

Le FOR XML PATH est une excellente solution. Cependant, vous devez savoir qu'il convertira tous les caractères spéciaux du jeu de résultats SELECT intérieur en leur équivalent xml. Par exemple, & deviendra & dans le jeu de résultats XML. Vous pouvez facilement revenir au caractère d'origine en utilisant la fonction REPLACE autour du jeu de résultats interne. Pour reprendre l'exemple précédent de Astander, il ressemblerait (notez que le SELECT comme 1er argument de la fonction REPLACE est enfermé dans():

--Concat 
SELECT t.ID, 
    REPLACE((SELECT tIn.Val + ',' 
     FROM @Table tIn 
     WHERE tIn.ID = t.ID 
     FOR XML PATH('')), '&', '&')) 
FROM @Table t 
GROUP BY t.ID 
Questions connexes