2012-10-01 3 views
4

정말 어떻게 쓰는지 모르겠지만 아래 정보를 친절하게 확인하십시오.SQL 쿼리 필드를 열로 정렬

학생

|Student_ID|Student_Name| 
|1   |Ryan  | 
|2   |Camille  | 
|3   |George  | 

학년

|Student_ID|Subject |Grade 
|1   |Math |5 
|1   |English |3 
|1   |History |1 
|2   |Math |3 
|2   |English |4 
|2   |History |1 
|3   |Math |5 
|3   |English |1 
|3   |History |2 

는이 결과를 얻을 수 있습니까?

Student_Name|Math|English|History 
Ryan  |5 |3  |1 
Camille  |3 |4  |1 
George  |5 |1  |2 

지금 내가 먼저 열 이름으로 언 바운드 데이터 그리드를 채워 이것을 hardway을 해 봤는데, 그 학생의 이름은 각 학생의 이름에 대한 세부 사항을 추가. 이 작업은 시간이 많이 걸리고 쿼리를 더 잘 최적화하고 싶습니다.

미리 감사드립니다.

답변

3

동안 @ 당신이 주제 알려진 번호가있는 경우 요한의 대답은, 작동이 주제의 알 수없는 번호가있는 경우 다음이를 생성하기 위해 준비된 문을 사용할 수 있습니다 동적으로 여기에 좋은 기사입니다

Dynamic pivot tables (transform rows to columns)

과 같을 것이다 귀하의 코드 :

SET @sql = NULL; 
SELECT 
    GROUP_CONCAT(DISTINCT 
    CONCAT(
     'MAX(case when Subject = ''', 
     Subject, 
     ''' then Grade end) AS ', 
     Subject 
    ) 
) INTO @sql 
FROM grade; 

SET @sql = CONCAT('SELECT s.Student_name, ', @sql, ' 
        FROM student s 
        LEFT JOIN grade AS g 
        ON s.student_id = g.student_id 
        GROUP BY s.Student_name'); 

PREPARE stmt FROM @sql; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

가 내가 뭐하는 거지이 통합거야, SQL Fiddle With Demo

+0

나는 이것을 정말로 좋아한다! 지적 해 주셔서 감사합니다 :) –

+0

나는 @ John의 답을 가지고 작업 할 수있었습니다. 그 이유는 .net을 통해 열 이름을 가져와 다른 데이터 세트로 채 웁니다. 그런 다음 다른 데이터 세트에 행을 채 웁니다. 그러나 당신의 대답은 놀랍습니다. 와우, 와우. 감사. –

+0

@bluefeet, 나는 당신의 대답을 사용하고 그것을 저장 프로 시저로 변환 할 수있었습니다. 고맙습니다. –

11

시도

SELECT a.Student_name, 
     MAX(CASE WHEN subject = 'MATH' THEN grade ELSE NULL END) MathGrade, 
     MAX(CASE WHEN subject = 'ENGLISH' THEN grade ELSE NULL END) EnglishGrade, 
     MAX(CASE WHEN subject = 'History' THEN grade ELSE NULL END) HistoryGrade 
FROM Student a 
     LEFT JOIN Grade b 
      ON a.Student_ID = b.Student_ID 
GROUP BY a.Student_name 

SQLFiddle Demo

+1

감사를 참조 다시 얻을 것이다 그 결과는 당신에게 있습니다. –

+0

쿼리에서 과목 이름을 미리 정의했음을 발견했습니다. 시스템은 위에 제시된 것보다 많은 제목을 추가 할 수 있습니다. 사전 정의 된 쿼리를 가지지 않는 방법이 있습니까? 내 영어로 미안해. –

+0

좋아, 이건 내 질문을 해결, 난 그냥 조금 놀아 줘야 해. 감사. –

관련 문제