2013-04-01 40 views
0

我有3列(SID,SUBJECT,MARKS)的表:如何根據不同的WHERE條件將數據排列到不同的列中?

╔══════╦═════════╦═══════╗ 
║ SID ║ SUBJECT ║ MARKS ║ 
╠══════╬═════════╬═══════╣ 
║ 1A01 ║ ENG  ║ 66 ║ 
║ 1A02 ║ ENG  ║ 75 ║ 
║ 1A01 ║ MATH ║ 60 ║ 
║ 1A03 ║ ENG  ║ 73 ║ 
║ 1A02 ║ MATH ║ 35 ║ 
║ 1A03 ║ MATH ║ 80 ║ 
║ 1A01 ║ CHI  ║ 65 ║ 
║ 1A02 ║ CHI  ║ 74 ║ 
║ 1A03 ║ CHI  ║ 78 ║ 
╚══════╩═════════╩═══════╝ 

我想組由SID每一行中的數據,如:

╔══════╦═════╦═════╦══════╗ 
║ SID ║ CHI ║ ENG ║ MATH ║ 
╠══════╬═════╬═════╬══════╣ 
║ 1A01 ║ 65 ║ 66 ║ 60 ║ 
║ 1A02 ║ 74 ║ 75 ║ 35 ║ 
║ 1A03 ║ 78 ║ 73 ║ 80 ║ 
╚══════╩═════╩═════╩══════╝ 

我是新在MySQL中,我試圖使用子查詢和UNION,但它失敗了。 任何人都可以給我一些提示嗎?

+0

見樞軸表 - [MySQL的樞軸表(變換行列)](HTTP:// buysql。 com/mysql/12-how-to-pivot-tables.html),[Pivot table basics:rows to columns](http://www.artfulsoftware.com/infotree/queries.php#78),[Dynamic pivot tables (HTTP://買sql.com/mysql/14-how-to-automate-pivot-tables.html)。 – Devart

回答

5

如果這3個是唯一的主題,你可以使用CASE測試Subject爲每SID和碎石MAX()結果。

SELECT SID, 
     MAX(CASE WHEN Subject = 'Chi' THEN Marks ELSE NULL END) `Chi`, 
     MAX(CASE WHEN Subject = 'Eng' THEN Marks ELSE NULL END) `Eng`, 
     MAX(CASE WHEN Subject = 'Math' THEN Marks ELSE NULL END) `Math` 
FROM TableName 
GROUP BY SID 

但是如果你有數量不明的主題,然後使用PREPARE一個動態SQL是更喜歡。

SET @sql = NULL; 
SELECT 
    GROUP_CONCAT(DISTINCT 
    CONCAT(
     'MAX(CASE WHEN Subject = ''', 
     Subject, 
     ''' then Marks end) AS ', 
     CONCAT('`', Subject,'`') 
    ) 
) INTO @sql 
FROM TableName; 

SET @sql = CONCAT('SELECT SID, ', @sql, ' 
        FROM TableName 
        GROUP BY SID'); 

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

OUTPUT從兩個查詢

╔══════╦═════╦═════╦══════╗ 
║ SID ║ CHI ║ ENG ║ MATH ║ 
╠══════╬═════╬═════╬══════╣ 
║ 1A01 ║ 65 ║ 66 ║ 60 ║ 
║ 1A02 ║ 74 ║ 75 ║ 35 ║ 
║ 1A03 ║ 78 ║ 73 ║ 80 ║ 
╚══════╩═════╩═════╩══════╝ 
相關問題