[英]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
. 我有一个表,用于存储一系列事件的体育比赛结果:
ONS_Skippers
该表中与该问题相关的FK_EventID
: FK_EventID
, FK_SkipperID
和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
). 我正在从该数据库中提供不同的统计信息,但是我没有成功生成最高级的查询:我想列出每个参与者的平均表现(
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. 我将事件获胜的性能定义为100%,将事件中的最后一位定义为0%,并将两个范围之间的线性曲线的性能定义为。 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
. NumberOfParticipantsInTheEvent
因每个事件而异,因此需要从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. 抱歉,您未遵守您的列命名约定-我的OCD坚持我遵守自己的个人标准。 Fussy, I know.
挑剔,我知道。 [/Edit]
[/编辑]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.