Тъй като използвате MySQL, за да завъртите данните в колони, ще трябва да използвате агрегатна функция с CASE
израз:
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
Ако имате неизвестен брой events
, тогава ще трябва да използвате подготвен израз за генериране на динамичен SQL:
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;
Редактирайте #1, ако вашите events
се съхраняват в отделна таблица, тогава можете да използвате следното, за да генерирате динамичния резултат:
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;
Вижте SQL Fiddle с демонстрация