2015-04-21 158 views
0

我有一个表,用于存储运动结果的一系列事件:ONS_Skippers 从这个表中的相关列的问题是: FK_EventIDFK_SkipperIDintResultSQL查询,查询子

我从这个数据库中提出了不同的统计数据,但我没有成功地为最高级的数据生成查询:我想列出每个参与者的平均表现(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 

[编辑]道歉未贴到你的专栏命名惯例 - 我的强迫症坚持我坚持自己的个人标准。 Fussy,我知道。 [/编辑]

+0

谢谢@amcdermott!像魅力一样工作。也许还有其他答案,因为它沿着相同的路线,但我有一个错误,所以我坚持你的。使用代码的页面是:vsk-match.com/ons.asp?mode=hof – euphoria

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