2011-10-21 13 views
3

多くのスレッド、サイト、ブログ、およびAPIを検索しましたが、これを把握できないようです。私はジャンクションテーブルの行からCSV文字列を作成したいが、ここにキャッチがある。これは、データ全体のセットである必要があります。私は混乱していることを知っています、ここでは故障です。ジャンクションテーブルのコンマで区切られた文字列内部クエリ(SQL Server)

のは、次の表に一般的な例を使ってみましょう:

  • 学生(ID、名前、GPA)
  • クラス(ID、部門、レベル)
  • StudentsInClasses(StudentID、のClassID)

私はすべてのクラスを照会したいと思いますが、(レコードごとに)そのクエリ内で、各クラスのStudent IDのCSV文字列を取得したいとします。結果はこのようなものになります。

Class  StudentsID_CSVString 
-----  -------------------- 
BA302  1,2,3,4,5,6,7,8,9 
BA479  4,7,9,12,15 
BA483  7,9,12,18 

を私は次のようなCOALESCE文を使用しようとしましたが、私はそれが理由合体のための間抜けな構文で動作させることはできません。この目標を達成するためのよりよい方法があるのですか、まったく文法的に間違っているだけですか?あなたが一度に一つのクラスのための文字列を取得することができますカンマで区切られた文字列と変数@StudentsID_CSVStringを埋める技術で

declare @Students table (ID int, Name varchar(50), Gpa decimal(3,2)) 
declare @Classes table (ID int, Dept varchar(4), [Level] varchar(3)) 
declare @StudentsInClasses table (StudentID int, ClassID int) 
declare @StudentsID_CSVString varchar(128) 

insert into @Students (ID) values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12),(13),(14),(15),(16),(17),(18) 
insert into @Classes (ID, Dept, [Level]) values (1, 'BA', '302'), (2, 'BA', '379'), (3, 'BA', '483') 
insert into @StudentsInClasses (StudentID, ClassID) values 
    (1,1),(2,1),(3,1),(4,1),(5,1),(6,1),(7,1),(8,1),(9,1), 
    (4,2),(7,2),(9,2),(12,2),(15,2), 
    (7,3),(9,3),(12,3),(18,3) 

答えて

4

declare @StudentsID_CSVString varchar(128) 
select Dept + Level as 'Class', 
    coalesce(@StudentsID_CSVString + ',', '') 
     + CAST(StudentID as varchar(8)) as 'StudentsID_CSVString' 
from Classes 
    left outer join StudentsInClasses ON Classes.ID = StudentsInClasses.ClassID 

は、私がテストに次のコードを使用しました。結果セットで複数のクラスを取得するには、 for xml pathを使用できます。クエリここ

select C.Dept+C.Level as Class, 
     stuff((select ','+cast(S.StudentID as varchar(10)) 
       from StudentsInClasses as S 
       where S.ClassID = C.ID 
       for xml path('')), 1, 1, '') as StudentsID_CSVString 
from Classes as C 

テスト:http://data.stackexchange.com/stackoverflow/q/115573/

+2

神聖ながらくた。テスト済み、素晴らしい作品です。 +1 =) – jadarnel27

+0

@Mikael:あなたのコードで3つのクラスのそれぞれに '1,2,3,4,5,6,7,8,9'を取得します:( – Chiramisu

+1

@Chiramisu - あなたのテーブルにあなたの質問があります。私はStudentInClassesとClassの間の結合に問題があると思います。あるいはサブクラス 'whereClassID = C.ID'のwhere句を忘れてしまったのです。 –

関連する問題