2014-05-13 2 views
2

나는 SQL 결합 다중 테이블과 Pivotting는

SELECT S.studentID AS 'ID', S.FirstName + ' ' + S.LastName AS 'Full Name', M.Marks AS 'Subject' 
FROM Student AS S 
LEFT JOIN Mark AS M ON S.studentID = M.studentID AND M.subjectID = 'S1001' 
WHERE S.batchID = 1 

이 하나의 데이터 만 보여줍니다 ...이 테이블은

Student - studentID, batchID, courseID, FirstName, Last Name ... 
Subject - subjectID, courseID, subjectName ... 
Mark - markID, studentID, subjectID, Marks 
Course - courseID, courseName ... 

나는이와 결국 마지막으로 오랫동안이 작업을 시도하고있다가 하나의 제목에 대해서만 subjectName이 subjectID를 사용하여 C# (Winforms)에 의해 생성됩니다.

Student ID | Full Name | Elementary Programming in C 
------------------------------------------------------- 
    1  | student name |  50 
    2  | abc   |  80 

하지만 난이 (내가 subjectID가 주어진다면 윈폼을 사용하여 열 머리글을 생성해야하는 경우 상관하지 않습니다) 것처럼, 그 열에서 모든 과정에서 주제와 각각의 표시를 보여주고 싶은 ... .

Student ID | Full Name | Elementary Programming in C | HTML | ... 
----------------------------------------------------------------- 
    1  | student name |  50     | 70 | ... 
    2  | abc   |  80     | 60 | ... 

나는 피벗을 사용하여 시도했다, 그러나 그것은 매우 성공하지 못한 ... 희망 누군가가 나에게 아이디어 또는 두 가지를 줄 수 있으며, 좀 더 자세한 정보가 필요하면 그냥 물어

+0

학생 수가 얼마나되는지 알고 계십니까? – sgeddes

+0

@sgeddes 학생은 1 코스에만 참여할 수 있으므로 1 코스 만 참가할 수 있습니다. – Yve

+0

미리 정의 된 수의 예상 열이 있거나 결과 당 동적 인 것을 의미합니다. 고급 (예 : 기본 프로그래밍, html, C#, sql 등)의 열을 알고있는 경우 피벗 테이블을 쉽게 만들거나'max'를'case'와 함께 사용할 수 있습니다. 동적 컬럼 세트를 가지고 있다면'동적 SQL '문을 생성해야합니다. – sgeddes

답변

0

이것을 시도하십시오, DECLARE @cols AS NVARCHAR (MAX), @query AS NVARCHAR (MAX)

select @cols = stuff((select distinct ',' + quotename(subjectName) 
       from Subject WHERE courseID = 'C1001' 
     FOR XML PATH(''), TYPE 
     ).value('.', 'NVARCHAR(MAX)') 
    ,1,1,'') 

set @query = 'select studentID,' + @cols + ' 
     from 
     (
      select S.studentID, ss.subjectID, M.Marks 
      from Student S 
       join Subject ss on S.courseID = ss.courseID 
       join Mark M on M.subjectID = ss.SubjectID AND M.studentID = S.StudentID 
      where S.batchID = 1 
     ) x 
     pivot 
     (
      max(Marks) 
      for subjectName in (' + @cols + ') 
     ) p ' 

execute(@query)