Este tipo de transformación de datos se conoce como pivote. . MySQL no tiene una función pivote, por lo que querrá transformar los datos usando una función agregada con un CASE
expresión.
Si conoce los valores con anticipación para transformar, puede codificarlos de manera similar a esto:
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 con demostración .
Si los valores del sujeto son desconocidos o flexibles, es posible que desee utilizar una declaración preparada para generar 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 con demostración .
El resultado de ambas consultas es:
| STUDENTID | JAVA | C# | JAVASCRIPT |
--------------------------------------
| 10 | 46 | 65 | 79 |
| 11 | 66 | 85 | 99 |