Esse tipo de transformação de dados é conhecido como pivô . O MySQL não tem uma função pivô, então você vai querer transformar os dados usando uma função agregada com um
CASE
expressão. Se você souber os valores com antecedência para transformar, poderá codificá-los de forma semelhante a esta:
select studentid,
sum(case when subject = 'Java' then mark else 0 end) Java,
sum(case when subject = 'C#' then mark else 0 end) `C#`,
sum(case when subject = 'JavaScript' then mark else 0 end) JavaScript
from yourtable
group by studentid
Consulte SQL Fiddle with Demo .
Se os valores do assunto forem desconhecidos ou flexíveis, talvez você queira usar uma instrução preparada para gerar sql dinâmico:
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'sum(case when subject = ''',
subject,
''' then mark else 0 end) AS `',
subject, '`'
)
) INTO @sql
FROM yourtable;
SET @sql = CONCAT('SELECT studentid, ', @sql, '
from yourtable
group by studentid');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
Consulte SQL Fiddle with Demo .
O resultado para ambas as consultas é:
| STUDENTID | JAVA | C# | JAVASCRIPT |
--------------------------------------
| 10 | 46 | 65 | 79 |
| 11 | 66 | 85 | 99 |