2013-03-19 3 views
0

С другой вопрос, который я получил этот запрос, чтобы получить мои оценки суммируются правильно:SUM с шарниром для расчета общего балла

SELECT callSign,event, SUM(score) 
    FROM scores LEFT JOIN candidates 
ON scores.candidateID=candidates.id 
    WHERE candidateID IN 
    (SELECT id 
     FROM candidates 
    WHERE assessmentID='1321') 
    GROUP BY event, callSign 
    ORDER BY candidateID,event 

получить данные, которые выглядят как:

callSign event   TotalScore 
Y209 Bridge     45 
Y209 PSA      3 
Y209 Team Analyst Exam  40 
X125 PSA      1 
X125 Team Analyst Exam  38 
V023 Amazing Race Planning 37 

Что мне нужно это данные, как:

callSign  Bridge PSA Amazing Race Planning  Team Analyst Exam 
V023        37 
Y209   45  3         40   
X125     1         38   

ТАБЛИЦА СТРУКТУРА

`events` 
id event 
1 PSA 
2 Bridge 
30 Stress Board 
25 Amazing Race Planning 
26 Amazing Race Execution 

`scores` 
id candidateID  event   rubric   category       score comment 
1 18  Team Analyst Exam Team Leader Rubric Organizes and Tasks Team Members 3  
2 18  Team Analyst Exam Team Leader Rubric Roles and Responsibilities   5  
3 18  Team Analyst Exam Team Leader Rubric Backward Planning     5  
4 18  Team Analyst Exam Team Leader Rubric Time Management 

`candidates`  
id firstName middleInitial lastName callSign service  rank sex  height weight assessmentID currentlyAssessing hired 

позывные где X125 бы

+0

выглядит @bluefeet бить меня к нему. – dnagirl

+0

Ваш подзапрос не нужен – Strawberry

ответ

2

Поскольку вы используете 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; 

Edit # 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 with Demo

+0

спасибо, теперь что, если у меня есть таблица под названием 'events', которая имеет список событий, которые мне нужно заполнить? 'SELECT event FROM events ORDER BY id'. Могу ли я работать с этим запросом, поэтому мне не нужно статически добавлять события, когда они приходят и уходят? – h3rrmiller

+1

@ h3rrmiller См. Мое редактирование. Если у вас будет неизвестное количество «событий», вам нужно будет использовать динамический sql для генерации строки sql. Если вы обновите свой OP своими структурами таблиц, примерными данными, я могу показать вам, как именно это будет работать. – Taryn

+0

@ h3rrmiller Я вижу, что вы редактировали сообщение с таблицами 'score' и' events', но вы не указали таблицу 'кандидатов', можете ли вы добавить это? – Taryn

Смежные вопросы