Dato che stai usando MySQL, per trasformare i dati in colonne, dovrai usare una funzione di aggregazione con un CASE
espressione:
SELECT callSign,
SUM(case when event = 'Bridge' then score else 0 end) as Bridge,
SUM(case when event = 'PSA' then score else 0 end) as PSA,
SUM(case when event = 'Amazing Race Planning' then score else 0 end) As AmazingRacePlanning,
SUM(case when event = 'Team Analyst Exam' then score else 0 end) as TeamAnalystExam
FROM scores
LEFT JOIN candidates
ON scores.candidateID=candidates.id
WHERE candidateID IN (SELECT id
FROM candidates
WHERE assessmentID='1321')
GROUP BY callSign
Se hai un numero sconosciuto di events
, quindi dovrai utilizzare un'istruzione preparata per generare SQL dinamico:
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'sum(CASE WHEN event = ''',
event,
''' THEN score END) AS `',
event, '`'
)
) INTO @sql
FROM scores
LEFT JOIN candidates
ON scores.candidateID=candidates.id;
SET @sql
= CONCAT('SELECT callSign, ', @sql, '
FROM scores
LEFT JOIN candidates
ON scores.candidateID=candidates.id
WHERE candidateID IN (SELECT id
FROM candidates
WHERE assessmentID=''1321'')
GROUP BY callSign');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
Modifica n. 1, se i tuoi events
sono archiviati in una tabella separata, quindi puoi utilizzare quanto segue per generare il risultato dinamico:
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'sum(CASE WHEN event = ''',
event,
''' THEN score END) AS `',
event, '`'
)
) INTO @sql
FROM events;
SET @sql
= CONCAT('SELECT callSign, ', @sql, '
FROM scores
LEFT JOIN candidates
ON scores.candidateID=candidates.id
WHERE candidateID IN (SELECT id
FROM candidates
WHERE assessmentID=''1321'')
GROUP BY callSign');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
Vedi SQL Fiddle con demo