简体   繁体   中英

SQL query, sub queries

I have a table storing sports results for a series of events: ONS_Skippers The relevant columns from this table for the question are: FK_EventID , FK_SkipperID and intResult .

I'm presenting different statistics from this database, but I've not succeeded to generate the query for the most advanced one: I would like to list average performance for each participant ( FK_SkipperID ). I've defined performance to be 100% for an event win, 0% for last place in an event and performance on a linear curve between the two extents. The formula for this is:

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

NumberOfParticipantsInTheEvent varies from each event, hence needs to be counted from each group of FK_EventID . All my attempts so far has failed:

Example:

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

This gives error messages "Cannot perform an aggregate function on an expression containing an aggregate or a subquery".

Any idea on how to produce the wanted output?

Try to join to the subquery instead:

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

I think you could achieve this by joining to an inline table as follows...

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

[Edit] Apologies for not sticking to your column naming conventions - my OCD insisted I adhere to my own personal standard. Fussy, I know. [/Edit]

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM