2015-04-21 2 views
0

У меня есть таблица, хранящий спортивные результаты для ряда событий: ONS_Skippers Соответствующие столбцы из этой таблицы для вопроса являются: FK_EventID, FK_SkipperID и intResult.SQL запросов, подзапросы

Я представляю различные статистические данные из этой базы данных, но мне не удалось создать запрос для наиболее продвинутого: я хотел бы указать среднюю производительность для каждого участника (FK_SkipperID). Я определил производительность на 100% для выигрыша события, 0% для последнего места в событии и производительности на линейной кривой между двумя экстентами. Формула для этого:

Performance = 100*(1-(intResult-1)/(NumberOfParticipantsInTheEvent-1)) 

NumberOfParticipantsInTheEvent изменяется от каждого события, следовательно, должно быть подсчитано из каждой группы FK_EventID. Все мои попытки до сих пор не удалось:

Пример:

SELECT FK_SkipperID, AVG((1-(intResult-1.0)/((SELECT Count(FK_EventID) 
FROM ONS_Skippers AS ONS_Skippers2 
WHERE ONS_Skippers.FK_EventID = ONS_Skippers2.FK_EventID AND FK_SkipperID > 0 
GROUP BY FK_EventID)-1))*100) 
FROM ONS_Skippers 
GROUP BY FK_SkipperID 

Это дает сообщение об ошибке «Не удается выполнить агрегатную функцию на выражение, содержащее совокупность или подзапрос».

Любая идея о том, как производить требуемый выход?

+0

Примеры данных и желаемые результаты действительно помогут. На самом деле, ваш вопрос довольно неясен, потому что вы не предоставили «желаемый результат», просто сломанный запрос. –

+0

Я думаю, что вам нужно закрыть закрытую скобку после «FROM ONS_Skippers» –

+0

Я думаю, что я дал информацию о желаемом выпуске, @GordonLinoff :-) Во всяком случае, решение было предоставлено всего несколько минут после моего сообщения, и я счастлив человек ... Мое единственное сожаление в том, что я не публиковал здесь раньше, вместо того, чтобы тратить часы и часы, пытаясь выяснить это самостоятельно. Но я должен был знать пределы самообразованного программиста по хобби: -D. – euphoria

ответ

1

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

select SkipperID, 
     AVG(100*(1-(Result-1)/(p.NumParticipants-1))) as Performance 
    from Spike.Skippers s 
inner join (
       select EventId, Count(EventId) as NumParticipants -- Or Max(Result) 
        from Spike.Skippers 
        group by EventID 
      ) p on s.EventID = p.EventID 
group by SkipperID 

[Редактировать] Извиняюсь за не торчит к соглашениям об именах столбцов - мой OCD настаивал, чтобы я придерживался своего личного стандарта. Суетливый, я знаю. [/ Edit]

+0

Спасибо @amcdermott! Работал как шарм. Вероятно, и другой ответ, так как он идет по тому же пути, но у меня есть ошибка, поэтому я придерживаюсь твоей. Страница с использованием кода: vsk-match.com/ons.asp?mode=hof – euphoria

2

Try присоединиться к подзапрос вместо:

SELECT 
    FK_SkipperID, 
    AVG((1-(intResult-1.0)/(e.events-1))*100) 
FROM ONS_Skippers o 
INNER JOIN 
(
    SELECT Count(FK_EventID) AS events 
    FROM ONS_Skippers AS ONS_Skippers2 
    WHERE FK_SkipperID > 0 
    GROUP BY FK_EventID 
) e 
ON o.FK_EventID = e.FK_EventID 
GROUP BY FK_SkipperID 
Смежные вопросы