2010-11-29 18 views
0

Situation: Diese Tabelle enthält die Beziehung von Informationen zwischen einem Dokument Tabelle und einer Tabelle Benutzern. Bestimmte Benutzer müssen Dokumente (Typ) überprüfen oder genehmigen. Ich würde es gerne haben, wenn ich bei Bedarf alle Rezensenten in einer Zeile hätte. Also, wenn drei Nutzer Dokument 1, dann würde eine Reihe 346 hat, 394, 519 als Wert, da diejenigen, die GutachterSQL Server-Abfrage mit mehreren Werten in einer Spalte zu einer anderen Spalte in Bezug

sind

Tabelle: 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 

So würde gewünschtes Ergebnis sein ..

.

DocID..UserID ................ Typ ...

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 (Benutzer-ID AS varchar (5)) FROM xDocumentsUsers WHERE DocumentID = 1 SELECT @UsersID ...................... ....................... Ruft mir dieses Ergebnis: 386, 346, 394, 519 – sjpizzle

Antwort

1

Have ein Blick auf

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?

Ein einfaches Beispiel ist

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

ich die Art, wie dieses Beispiel funktioniert, wenn die Tabelle bereits vorhanden wäre Damit meine ich könnte nur verwenden, was ist nach --Concat? – sjpizzle

+0

Ja, das ist wahr. Das ist nur ein Beispiel, eine Tabelle Variable. –

0

hilft das?

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 -------- ------------------- SQL-Ausführungsfehler. Ausgeführte SQL-Anweisung: SELECT DocumentID, [Typ], (SELECT CAST (BenutzerID + ',' AS VARCHAR (MAX)) FROM [xDocumentsUsers] WHERE (UserID = x1.UserID) FÜR XML PATH ('')) AS [ UserIDs] FROM [xDocumentsUsers] AS x1 Fehlerquelle: .Net SqlClient-Datenprovider Fehlermeldung: Die Konvertierung ist fehlgeschlagen, wenn der Varchar-Wert ',' in den Datentyp int konvertiert wurde. --------------------------- OK Hilfe ------------------ --------- – sjpizzle

2

Der FOR XML PATH ist eine großartige Lösung. Sie müssen sich bewusst sein, aber, dass es keine Sonderzeichen in den inneren SELECTs in ihre XML-Äquivalent Ergebnismenge konvertieren - das heißt & & in der XML-Ergebnismenge werden wird. Sie können einfach zum ursprünglichen Zeichen zurückkehren, indem Sie die REPLACE-Funktion für die innere Ergebnismenge verwenden. Leihen von Astander des vorherigen Beispiel würde es aussehen (beachten Sie, dass die SELECT als erstes Argument an die REPLACE-Funktion ist eingeschlossen in():

--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 
Verwandte Themen