SQL — проблема с наличием и группировкой

Привет, у меня проблема с запросом, который когда-то работал. Мои навыки SQL не так уж хороши, не знаю, чего мне не хватает. Или это правильный подход. Может быть, вместо этого использовать временную таблицу?

Основная суть дается в определенные сроки, мне нужно рассчитать наивысшую совокупность баллов за 5 классов.

TrialScores - хранит оценки/очки, испытания, собаку, людей и таблицы участников - это просто метаданные.

classId 5 требует другого диапазона дат

Вот мой запрос на MySQL

select
    t.id,
    d.id,
    p.id,
    p.firstname,
    p.lastname,
    d.id dogId,
    d.dogName,
    c.id,
    c.class,
    t.trialStartDate,
    s.points,
    if(c.id = 5, '2012-08-01', '2012-11-18') as startDate,
    if(c.id = 5, '2013-07-31', '2013-12-31') as endDate,
    SUM(ts.points) AS pointsAggregate
from trialScores ts
    inner join trials t on t.id = ts.trialId
    inner join dogs d on d.id = ts.dogId
    inner join people p on p.id = ts.personId
    inner join classes c on c.id = ts.classId
where t.deletedAt is null
    and ts.deletedAt is null
    and ts.memberAtTrial = 1
    and d.omitFromTripleCrownDOY = 0
    and t.associationId = 1           
GROUP BY p.id, ts.dogId, ts.classId
having t.trialStartDate between startDate and endDate
order by ts.classId, pointsAggregate desc

Похоже, это исправлено, слишком много в выборе, а не в группе?:

 select
d.dogName,
c.class,
p.firstName,
p.lastName,    
SUM(ts.points) AS pointsAggregate
from trialScores ts
inner join trials t on t.id = ts.trialId
inner join dogs d on d.id = ts.dogId
inner join people p on p.id = ts.personId
inner join classes c on c.id = ts.classId
where t.deletedAt is null
and ts.deletedAt is null
and ts.memberAtTrial = 1
and d.omitFromTripleCrownDOY = 0
and t.associationId = 1 
and t.trialStartDate between if(c.id = 5, '2012-08-01', '2012-11-18') and if(c.id = 5, '2013-07-31', '2013-12-31')  
GROUP BY ts.dogId, ts.classId
order by ts.classId, pointsAggregate desc

person boyceofreason    schedule 14.07.2013    source источник
comment
Итак, в чем проблема с запросом, получающим какую-либо ошибку? или вы не получаете ожидаемого результата?   -  person user2510115    schedule 14.07.2013
comment
Можете ли вы предоставить некоторые образцы данных и ожидаемые результаты?   -  person Gordon Linoff    schedule 14.07.2013
comment
Извините, ошибок нет. Плохие результаты. Если я вручную просматриваю данные и сравниваю их, то некоторые люди даже не включаются в результаты, которые, как я знаю, должны быть там. Позвольте мне посмотреть, смогу ли я настроить sqlfiddle, это может занять некоторое время.   -  person boyceofreason    schedule 14.07.2013
comment
Слишком много данных для добавления, но если бы у Джона было 2 пробных балла 3 и 4, а у Сью и пробных баллов 5 и 6 для classId 1. И у Билла были пробные баллы 0 и 15, а у Мэри были пробные баллы 5 и 5 для класса 2. Я бы хотите, чтобы на выходе было: КЛАСС 1 - Сью 11, Джон 7 - КЛАСС 2 - Билл 15, Мэри 10 и так далее...   -  person boyceofreason    schedule 14.07.2013


Ответы (1)


Можете ли вы попробовать запрос ниже и сообщить, работает он или нет?

select
d.dogName,
c.class,
p.firstName,
p.lastName,    
SUM(ts.points) AS pointsAggregate
from trialScores ts
inner join trials t on t.id = ts.trialId
inner join dogs d on d.id = ts.dogId
inner join people p on p.id = ts.personId
inner join classes c on c.id = ts.classId
where t.deletedAt is null
and ts.deletedAt is null
and ts.memberAtTrial = 1
and d.omitFromTripleCrownDOY = 0
and t.associationId = 1 
and t.trialStartDate between if(c.id = 5, '2012-08-01', '2012-11-18') and if(c.id = 5, '2013-07-31', '2013-12-31')  
GROUP BY ts.classId,p.firstName,p.lastName 
order by ts.classId, pointsAggregate desc
person user2510115    schedule 14.07.2013
comment
Хорошо, что там происходит, это дает мне первое место в классе. Таким образом, я получаю 5 результатов, по одному на класс с максимальной суммой баллов. А совокупность/люди далеко. - person boyceofreason; 15.07.2013