2013-05-18 2 views
1

나는 다음과 같은 데이터베이스가 말 :MySQL의에서 열로 테이블 행을 돌려

표 student_info :

id name 
111 jon 
112 dan 
113 david 
... 

및 테이블 점수 :

item_id student_id score 
01   111   37 
02   111   45 
01   112   55 
02   112   44 
01   113   66 
02   113   45 
... 

할하는 것이 가능 다음 테이블을 생성하는 mysql 쿼리? :

Student_Name ITEM_1_SCORE ITEM_2_SCORE 
jon   37   45 
dan   55   44 
david   66   45 
... 

그렇다면 구문은 무엇입니까? 이 작업이 조인 작업인지 아니면 다른 작업인지 알 수 없습니까?

감사합니다. 이처럼

+0

네, 가능합니다. 이것은 간단한 피벗 테이블 쿼리입니다. 그러나 일반적으로 응용 프로그램 수준에서 이러한 종류의 데이터 표시 문제를 처리하는 것이 좋습니다. – Strawberry

답변

7

item_id 만 두 개의 값을 가지고 있다면, 그것은 하드 코드 값으로 괜찮습니다. 당신이 점수를 알 수없는 번호가 예를

SELECT a.Name AS Student_Name, 
     MAX(CASE WHEN item_id = '01' THEN b.score END) Item_1_Score, 
     MAX(CASE WHEN item_id = '02' THEN b.score END) Item_2_Score 
FROM student_info a 
     LEFT JOIN scores b 
      ON a.id = b.student_ID 
GROUP BY a.Name 

그렇지 않으면,하는 Dynamic SQL 훨씬 선호한다.

  • SQLFiddle Demo (with extra item_id)
  • 두 쿼리

    • SQLFiddle Demo

      SELECT GROUP_CONCAT(DISTINCT 
           CONCAT('MAX(CASE WHEN item_id = ''', 
             item_id, 
             ''' THEN Score END) AS ', 
             CONCAT('`Item_', item_id, '_Score`') 
             )) INTO @sql 
      FROM scores; 
      
      SET @sql = CONCAT('SELECT a.Name AS Student_Name, ', @sql, ' 
              FROM student_info a 
                LEFT JOIN scores b 
                 ON a.id = b.student_ID 
              GROUP BY a.Name'); 
      
      PREPARE stmt FROM @sql; 
      EXECUTE stmt; 
      DEALLOCATE PREPARE stmt; 
      
      를 출력 같은

      ╔══════════════╦══════════════╦══════════════╗ 
      ║ STUDENT_NAME ║ ITEM_1_SCORE ║ ITEM_2_SCORE ║ 
      ╠══════════════╬══════════════╬══════════════╣ 
      ║ dan   ║   55 ║   44 ║ 
      ║ david  ║   66 ║   45 ║ 
      ║ jon   ║   37 ║   45 ║ 
      ╚══════════════╩══════════════╩══════════════╝ 
      
    +0

    약 45 개의 항목이 있으므로 실제로 도움이되었습니다. 나는 처음에는 내가 이해하지 못했던 문법 때문에 무서웠다 고 생각합니다. – ejsuncy

    3

    :

    SELECT 
        i.name AS Student_Name, 
        MAX(CASE WHEN s.item_id = 1 THEN score END) AS ITEM_1_SCORE, 
        MAX(CASE WHEN s.item_id = 2 THEN score END) AS ITEM_2_SCORE 
    FROM student_info AS i 
    INNER JOIN scores AS s ON s.student_id = i.id 
    GROUP BY i.name; 
    

    여기에 직접보기 :

    이 당신을 줄 것이다 :

    | STUDENT_NAME | ITEM_1_SCORE | ITEM_2_SCORE | 
    ---------------------------------------------- 
    |   dan |   55 |   44 | 
    |  david |   66 |   45 | 
    |   jon |   37 |   45 | 
    
    +0

    감사합니다. 매우 명확하고 간단합니다. – ejsuncy

    +0

    @ejsuncy - 언제든지 환영합니다 :) –