3

私は多くのスレッド、サイト、ブログ、およびAPIを検索しましたが、これを理解できないようです。ジャンクションテーブルの行からCSV文字列を作成したいのですが、ここに問題があります。データセット全体を対象とする必要があります。わかりにくいですが、ここに内訳があります。

次の表で一般的な例を使用してみましょう。

  • 学生(ID、名前、Gpa)
  • クラス(ID、部門、レベル)
  • StudentInClasses(StudentID、ClassID)

すべてのクラスをクエリしたいが、そのクエリ内で(レコードごとに)各クラスの学生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

次のような合体ステートメントを使用しようとしましたが、合体の構文がおかしなため、機能させることができません。この目標を達成するためのより良い方法はありますか、それとも私はただの構文エラーを犯していますか?

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

次のコードを使用してテストしました。

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

1 に答える 1

4

変数をコンマ区切りの文字列で埋める手法@StudentsID_CSVStringでは、一度に1つのクラスの文字列しか取得できません。結果セットで複数のクラスを取得するには、を使用できます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

ここでクエリをテストします:https ://data.stackexchange.com/stackoverflow/q/115573/

于 2011-10-21T19:43:35.287 に答える