Dit type gegevenstransformatie staat bekend als een pivot . MySQL heeft geen spilfunctie, dus u zult de gegevens willen transformeren met behulp van een aggregatiefunctie met een CASE
uitdrukking.
Als je de waarden van tevoren weet om te transformeren, dan kun je ze hardcoderen zoals dit:
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
Zie SQL Fiddle met demo .
Als de waarden van het onderwerp onbekend of flexibel zijn, wilt u misschien een voorbereide instructie gebruiken om dynamische sql te genereren:
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;
Zie SQL Fiddle met demo .
Het resultaat voor beide zoekopdrachten is:
| STUDENTID | JAVA | C# | JAVASCRIPT |
--------------------------------------
| 10 | 46 | 65 | 79 |
| 11 | 66 | 85 | 99 |