2013-05-18 96 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得多優先。

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 - 隨時歡迎您:) –