2013-04-01 3 views
0

У меня есть таблица, в которой есть 3 колонки (SID, ПРЕДМЕТ, баллах):Как упорядочить данные в разных условиях ГДЕ в разных столбцах?

╔══════╦═════════╦═══════╗ 
║ 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 ║ 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), [Основы таблицы сводных данных: строки в столбцы] (http://www.artfulsoftware.com/infotree/queries.php#78), [Динамические сводные таблицы ] (Http: // купить sql.com/mysql/14-how-to-automate-pivot-tables.html). – Devart

ответ

5

Если эти три являются единственными субъектами, вы можете использовать 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 

Но если у вас есть неизвестное количество предметов, то Dynamic SQL который использует PREPARE гораздо предпочтительнее.

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 ║ 
╚══════╩═════╩═════╩══════╝ 
Смежные вопросы