2012-11-22 3 views
3

가 나는 모든 학생들을 표시하고 각 열이 피벗 테이블보기를 할 노력하고있어 세 개의 테이블MySQL의 피벗 테이블 및

학생 student_intervention 개입 세부

와 MySQL의 DB를 가지고 JOINS 개입 유형은 각 학생에 대한 다양한 유형의 개입을 합산합니다.

은 지금까지 나는이 작동하지만 그것은 단지 개입이 학생들을위한 데이터를 표시

SELECT t.`first_name`, t.`last_name`, t.`student_id`, 
     Count(IF(t.`intervention_details_id` = 1, 1, null)) AS Intervention1, 
     Count(IF(t.`intervention_details_id` = 0, 1, null)) AS Intervention2 
FROM (
      SELECT student.`student_id`, student.`first_name`, 
        student.`last_name`, 
        `student_intervention`.`intervention_details_id` 
      FROM student, student_intervention 
      WHERE student_intervention.student_id = student.`student_id` 
      ) t 
GROUP BY t.student_id 

있습니다. 개입하지 않은 학생을 포함하여 전체 학생 목록을 원합니다. 나는 JOIN이 필요하다고 생각하지만 올바른 것을 알아 내지 못합니다.

아무도 도와 줄 수 있습니까?

답변

2

사용 LEFT JOIN 대신

SELECT a.`student_id`, 
     a.`first_name`, 
     a.`last_name`, 
     SUM(IF(COALESCE(b.`intervention_details_id`,0) = 1, 1, 0)) Intervention1, 
     SUM(IF(COALESCE(b.`intervention_details_id`,0) = 0, 1, 0)) Intervention2 
FROM student a 
     LEFT JOIN student_intervention b 
      ON b.student_id = a.`student_id` 
GROUP BY a.`student_id`, a.`first_name`, a.`last_name` 

준비한 문장을

SET @sql = NULL; 

SELECT 
    GROUP_CONCAT(DISTINCT 
    CONCAT(
     'SUM(CASE WHEN COALESCE(b.intervention_details_id ,0) = ', 
     COALESCE(b.intervention_details_id ,0), 
     ' THEN 1 ELSE 0 END) AS ', 
     COALESCE(b.intervention_details_id ,0) 
    ) 
) INTO @sql 
FROM student a 
     LEFT JOIN student_intervention b 
      ON b.student_id = a.student_id; 

SET @sql = CONCAT('SELECT a.student_id , a.first_name , a.last_name , ', @sql, ' 
        FROM  student a 
          LEFT JOIN student_intervention b 
           ON b.student_id = a.student_id 
        GROUP BY a.student_id , a.first_name , a.last_name'); 

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

감사를 원하는 경우 지금까지 너무 많은 – salongley

+0

당신을 환영합니다. –