2010-11-29 8 views
0

状況:このテーブルには、DocumentsテーブルとUsersテーブル間のリレーション情報が保持されます。特定のユーザーは、文書を確認または承認する必要があります(タイプ)。私は、必要に応じてすべてのレビューアを1行で入手できる場所に持っていたいと思います。それらは、レビューアが別の列に関連する1つの列に複数の値を持つSQL Serverクエリ

表であるので、3人のユーザのレビュー文献1には、その行は、値として346、394、519を有することになるので、もし: 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 

所望の結果は次のようになり.. 。

DocID..UserID ................タイプ...

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)(@UsersID = COALESCEを選択します@ユーザーID + '、'、 '')+ CAST(UserID AS varchar(5))FROM xDocumentsUsers WHERE DocumentID = 1 SELECT @UsersID ...................... .......................この結果を取得します:386、346、394、519 – sjpizzle

答えて

1

てきました

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?

を見て簡単な例は、

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

テーブルがすでに存在する場合、この例のように動作しますつまり、私はちょうど--Concatの後にあるものを使うことができるという意味ですか? – sjpizzle

+0

はい、それは本当です。これは単なる例であり、テーブル変数を使用しています。 –

0

では、このヘルプをしていますか?

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実行エラー。 実行されるSQLステートメント:SELECT DocumentID、[タイプ]、(SELECT CAST(ユーザーID + '、AS VARCHAR(MAX))FROM [xDocumentsUsers] WHERE(ユーザーID = x1.UserID)FOR XML PATH(' ')ユーザーID] FROM [xDocumentsUsers] AS x1 エラーソース:.Net SqlClientデータプロバイダー エラーメッセージ:varchar値 '、'をデータ型intに変換するときに変換に失敗しました。 --------------------------- OKヘルプ ------------------ --------- – sjpizzle

2

FOR XML PATHは素晴らしいソリューションです。ただし、内側のSELECTs結果セットの特殊文字をxmlに変換することを覚えておく必要があります。つまり、&はXML結果セットで&になります。内部の結果セットの回りにREPLACE関数を使用すると、元の文字に簡単に戻すことができます。 astanderの前の例から借りて、それはREPLACE関数の第一引数としてSELECTがで囲まれていることに注意してください(次のようになります():

--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 
関連する問題