SQL查询,子查询

时间:2015-04-21 15:00:20

标签: sql

我有一个表格,用于存储一系列活动的体育赛事结果:ONS_Skippers 该表中针对该问题的相关列是: FK_EventIDFK_SkipperIDintResult

我在这个数据库中展示了不同的统计数据,但是我还没有成功为最高级的数据生成查询:我想列出每个参与者的平均绩效(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

这会给出错误消息"无法对包含聚合或子查询的表达式执行聚合函数"。

关于如何产生想要的输出的任何想法?

2 个答案:

答案 0 :(得分:2)

尝试加入子查询:

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

答案 1 :(得分: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坚持认为我遵守自己的个人标准。挑剔,我知道。 [/编辑]