2015-04-21 156 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